#include <bits/stdc++.h>
using namespace std;
const int maxn = 500000 + 100;
int n;
int ara[maxn];
int ans[maxn];
int tree[maxn * 4];
int lazy[maxn * 4];
void push_down(int nd, int b, int e) {
  if (b == e) {
    tree[nd] += lazy[nd];
  } else {
    int lnd = nd * 2, rnd = lnd + 1, mid = (b + e) / 2;
    tree[nd] += lazy[nd];
    lazy[lnd] += lazy[nd];
    lazy[rnd] += lazy[nd];
  }
  lazy[nd] = 0;
}
void update(int nd, int b, int e, int i, int j, int val, int setval) {
  if (lazy[nd] != 0) push_down(nd, b, e);
  if (i > e or j < b) return;
  if (i <= b and j >= e) {
    if (setval) tree[nd] = 0;
    lazy[nd] += val;
    push_down(nd, b, e);
    return;
  }
  int lnd = nd * 2, rnd = lnd + 1, mid = (b + e) / 2;
  update(lnd, b, mid, i, j, val, setval);
  update(rnd, mid + 1, e, i, j, val, setval);
  tree[nd] = max(tree[lnd], tree[rnd]);
}
int query(int nd, int b, int e, int i, int j) {
  if (i > j) return 0;
  if (lazy[nd] != 0) push_down(nd, b, e);
  if (i > e or j < b) return 0;
  if (i <= b and j >= e) return tree[nd];
  int lnd = nd * 2, rnd = lnd + 1, mid = (b + e) / 2;
  int q1 = query(lnd, b, mid, i, j);
  int q2 = query(rnd, mid + 1, e, i, j);
  return max(q1, q2);
}
int main() {
  int t;
  scanf("%d", &t);
  while (t--) {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) scanf("%d", ara + i);
    int N = n + 1;
    update(1, 1, N, N, N, N, 1);
    for (int i = n; i >= 1; i--) {
      if (ara[i] == -1)
        update(1, 1, N, i, i, 1, 1);
      else {
        int q = query(1, 1, N, i + 1, ara[i] - 1);
        q++;
        int q2 = query(1, 1, N, ara[i], ara[i]);
        update(1, 1, N, i, i, q, 1);
        if (q >= q2) update(1, 1, N, ara[i], N, q - q2 + 1, 0);
      }
    }
    vector<pair<int, int> > v;
    v.clear();
    for (int i = 1; i <= n; i++) {
      int q = query(1, 1, N, i, i);
      v.push_back(make_pair(q, i));
    }
    int idx = 1;
    sort(v.begin(), v.end());
    for (int i = 0; i < n; i++) {
      int val = v[i].first;
      int index = v[i].second;
      ans[index] = idx++;
    }
    bool okay = true;
    for (int i = 1; i <= n; i++) {
      if (ara[i] == -1) continue;
      int q = query(1, 1, N, i, i);
      int q2 = query(1, 1, N, ara[i], ara[i]);
      int q3 = query(1, 1, N, i + 1, ara[i] - 1);
      if (q3 > q2 or q > q2 or q < q3) okay = false;
    }
    if (!okay)
      printf("-1\n");
    else {
      for (int i = 1; i <= n; i++) printf("%d ", ans[i]);
      printf("\n");
    }
  }
  return 0;
}
