#include <bits/stdc++.h>
using namespace std;
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
vector<long long> ans, p;
long long num;
void dfs(long long now, vector<vector<long long> > &g) {
  for (long long i = 0; i < (g[now].size()); i++) {
    long long ne = g[now][i];
    ans[ne] = num;
    num--;
    dfs(ne, g);
  }
}
class SegTree {
 private:
  long long n;
  vector<long long> seg;
  long long init = 0;
  long long combine(long long a, long long b) { return max(a, b); }

 public:
  SegTree() {}
  SegTree(long long size) {
    n = 1;
    while (n < size) n <<= 1;
    seg = vector<long long>(2 * n, init);
  }
  SegTree(const vector<long long> &in) {
    n = 1;
    while (n < in.size()) n <<= 1;
    seg = vector<long long>(2 * n, init);
    for (long long i = n - 1 + in.size() - 1; i >= 0; i--) {
      if (n - 1 <= i)
        seg[i] = in[i - (n - 1)];
      else
        seg[i] = combine(seg[i * 2 + 1], seg[i * 2 + 2]);
    }
  }
  void update(long long k, long long a) {
    k += n - 1;
    seg[k] = a;
    while (k > 0) {
      k = (k - 1) / 2;
      seg[k] = combine(seg[k * 2 + 1], seg[k * 2 + 2]);
    }
  }
  void add(long long k, long long a) {
    k += n - 1;
    seg[k] += a;
    while (k > 0) {
      k = (k - 1) / 2;
      seg[k] = combine(seg[k * 2 + 1], seg[k * 2 + 2]);
    }
  }
  long long query(long long a, long long b, long long k = 0, long long l = 0,
                  long long r = -1) {
    if (r == -1) r = n;
    if (r <= a || b <= l) return init;
    if (a <= l && r <= b) return seg[k];
    long long vl = query(a, b, k * 2 + 1, l, (l + r) / 2);
    long long vr = query(a, b, k * 2 + 2, (l + r) / 2, r);
    return combine(vl, vr);
  }
};
bool check() {
  SegTree st(ans);
  for (long long i = 0; i < (ans.size()); i++) {
    if (st.query(i, p[i] - 1) > ans[i]) return false;
  }
  return true;
}
signed main(void) {
  long long t;
  cin >> t;
  while (t--) {
    long long n;
    scanf("%lld", &n);
    p = vector<long long>(n);
    for (long long i = 0; i < (n); i++) scanf("%lld", &p[i]);
    vector<vector<long long> > g(n + 1);
    for (long long i = 0; i < (n); i++)
      if (p[i] != -1) {
        g[p[i] - 1].push_back(i);
      }
    ans = vector<long long>(n);
    num = n;
    dfs(n, g);
    for (long long i = n - 1; i >= 0; i--)
      if (ans[i] == 0) {
        ans[i] = num;
        num--;
        dfs(i, g);
      }
    if (check()) {
      for (long long i = 0; i < (n); i++) cout << ans[i] << " ";
      cout << endl;
    } else {
      cout << -1 << endl;
    }
  }
}
