#include <bits/stdc++.h>
using namespace std;
const int c1 = 1e9 + 7;
const int c2 = 1e9 + 9;
const long long bs = (long long)239;
const int inf = 1e9 + 9;
int n;
vector<vector<int> > g, gr;
vector<int> lvl, ts, us;
vector<int> ans;
bool F = 1;
void dfs(int u, int p) {
  us[u] = 1;
  for (int v : g[u])
    if (us[v] != -1) dfs(v, u);
}
int T;
void bfs(int v) {
  set<pair<int, int> > q;
  q.insert({0, v});
  us[v] = 2;
  while (!q.empty()) {
    int u = (q.begin()->second);
    int d = q.begin()->first;
    q.erase(q.begin());
    ans[u] = T--;
    us[u] = 2;
    for (int r : gr[u])
      if (us[r] != 2) q.insert({d + 1, r});
  }
}
void solve() {
  ans.assign(n + 1, 0);
  T = n + 1;
  F = 1;
  us.assign(n + 1, -1);
  for (int i = 0; i < n; ++i)
    if (us[i] == -1) dfs(i, -1);
  for (int i = n; i >= 0; i--)
    if (us[i] != 2) bfs(i);
}
struct DO {
  vector<int> t;
  void build(int v, int l, int r, vector<int> &a) {
    if (l == r) {
      t[v] = a[l];
      return;
    }
    int m = (l + r) / 2;
    build(2 * v + 1, l, m, a);
    build(2 * v + 2, m + 1, r, a);
    t[v] = max(t[2 * v + 1], t[2 * v + 2]);
  }
  DO(int n, vector<int> &a) {
    t.resize(4 * n);
    build(0, 0, n - 1, a);
  }
  int qr(int v, int l, int r, int L, int R) {
    if (l >= L && r <= R) return t[v];
    if (l > R || r < L) return -1;
    int m = (l + r) / 2;
    int q1 = qr(2 * v + 1, l, m, L, R);
    int q2 = qr(2 * v + 2, m + 1, r, L, R);
    return max(q1, q2);
  }
};
int main() {
  int TT;
  cin >> TT;
  while (TT--) {
    cin >> n;
    vector<int> b(n);
    g.assign(n + 1, {});
    lvl.assign(n + 1, -1);
    gr.assign(n + 1, {});
    for (int i = 0; i < n; ++i) {
      int p;
      cin >> p;
      p--;
      b[i] = p;
      if (p != -2) {
        g[i].push_back(p);
        gr[p].push_back(i);
      }
    }
    solve();
    DO t = DO(n, ans);
    bool f = 1;
    for (int i = 0; i < n; ++i) {
      if (b[i] != i + 1) {
        int x = t.qr(0, 0, n - 1, i + 1, b[i] - 1);
        if (x > ans[i]) f = 0;
      }
    }
    if (f) {
      for (int j = 0; f && j < n; ++j) cout << ans[j] << " ";
    } else
      cout << -1;
    cout << endl;
  }
  return 0;
}
