#include <bits/stdc++.h>
using namespace std;
template <class A, class B>
ostream& operator<<(ostream& out, const pair<A, B>& a) {
  return out << "(" << a.first << ", " << a.second << ")";
}
template <class A>
ostream& operator<<(ostream& out, const vector<A>& a) {
  out << "[";
  for (auto it = a.begin(); it != a.end(); ++it) {
    if (it != a.begin()) out << ", ";
    out << *it;
  }
  return out << "]";
}
const int N = 500005;
int indeg[N];
vector<int> topo, l;
vector<int> adj[N];
int n, a[N];
bool check() {
  int i, j, x, y;
  vector<int> v(n + 1, n);
  stack<int> s;
  s.push(0);
  for (i = 1; i < n; i++) {
    if (s.empty()) {
      s.push(i);
      continue;
    }
    while (!s.empty() && topo[s.top()] <= topo[i]) {
      v[s.top() + 1] = i + 1;
      s.pop();
    }
    s.push(i);
  }
  while (!s.empty()) {
    v[s.top() + 1] = n + 1;
    s.pop();
  }
  for (i = 1; i <= n; i++) {
    if (a[i] != v[i]) return 0;
  }
  return 1;
}
bool toposort() {
  priority_queue<int> pq;
  for (int i = 1; i <= n; i++)
    for (auto& it : adj[i]) indeg[it]++;
  for (int i = 1; i <= n; i++) {
    if (!indeg[i]) pq.push(i);
  }
  while (!pq.empty()) {
    int u = pq.top();
    pq.pop();
    topo[u - 1] = l.back();
    l.pop_back();
    for (auto& v : adj[u]) {
      indeg[v]--;
      if (!indeg[v]) pq.push(v);
    }
  }
  if (topo.size() < n) return 0;
  return 1;
}
void solve() {
  int i, j, x, y, m, k, t;
  cin >> n;
  for (i = 1; i <= n; i++) {
    adj[i].clear();
  }
  topo.assign(n, 0);
  l.clear();
  for (i = n; i > 0; i--) l.push_back(i);
  for (i = 1; i <= n; i++) cin >> a[i];
  for (i = 1; i <= n; i++) {
    if (a[i] == -1) a[i] = i + 1;
    if (a[i] <= n) adj[i].push_back(a[i]);
  }
  if (!toposort())
    cout << "-1\n";
  else {
    if (!check())
      cout << "-1";
    else
      for (auto p : topo) cout << p << " ";
    cout << "\n";
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int i, j, x, y, m, k, t;
  cin >> t;
  while (t--) {
    solve();
  }
}
