#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e5 + 5;
const int inf = 0x3f3f3f3f;
int n;
struct SegmentTree {
  int mn, id, col;
} tree[maxn << 2];
void up(int p) {
  if (tree[p * 2].mn < tree[p * 2 + 1].mn) {
    tree[p].mn = tree[p * 2].mn;
    tree[p].id = tree[p * 2].id;
  } else {
    tree[p].mn = tree[p * 2 + 1].mn;
    tree[p].id = tree[p * 2 + 1].id;
  }
}
void down(int p) {
  if (tree[p].col) {
    tree[p * 2].mn += tree[p].col;
    tree[p * 2 + 1].mn += tree[p].col;
    tree[p * 2].col += tree[p].col;
    tree[p * 2 + 1].col += tree[p].col;
    tree[p].col = 0;
  }
}
void build(int p, int l, int r) {
  tree[p].col = 0;
  if (l == r) {
    tree[p].id = l;
    tree[p].mn = 0;
    return;
  }
  int mid = (l + r) / 2;
  build(p * 2, l, mid);
  build(p * 2 + 1, mid + 1, r);
  up(p);
}
void add(int p, int l, int r, int L, int R, int d) {
  if (L > R || L < 0 || R > n) return;
  if (L <= l && r <= R) {
    tree[p].col += d;
    tree[p].mn += d;
    return;
  }
  down(p);
  int mid = (l + r) / 2;
  if (L <= mid) add(p * 2, l, mid, L, R, d);
  if (R > mid) add(p * 2 + 1, mid + 1, r, L, R, d);
  up(p);
}
void change(int p, int l, int r, int x, int d) {
  if (x == 0 || x > n) return;
  if (l == r) {
    tree[p].mn = d;
    return;
  }
  down(p);
  int mid = (l + r) / 2;
  if (x <= mid)
    change(p * 2, l, mid, x, d);
  else
    change(p * 2 + 1, mid + 1, r, x, d);
  up(p);
}
pair<int, int> ask(int p, int l, int r, int L, int R) {
  if (L <= l && r <= R) {
    return make_pair(tree[p].mn, tree[p].id);
  }
  down(p);
  int mid = (l + r) / 2;
  pair<int, int> ret = make_pair(inf, 0);
  if (L <= mid) ret = min(ret, ask(p * 2, l, mid, L, R));
  if (R > mid) ret = min(ret, ask(p * 2 + 1, mid + 1, r, L, R));
  up(p);
  return ret;
}
int nxt[maxn];
int L[maxn], R[maxn];
vector<int> G[maxn];
void init() {
  for (int i = 0; i <= n; i++) G[i].clear();
}
int ans[maxn];
bool topo() {
  for (int i = 1; i <= n; i++) ans[i] = 0;
  int now = n;
  pair<int, int> s = ask(1, 1, n, 1, n);
  if (s.first > 0) return 0;
  while (s.first == 0) {
    ans[s.second] = now--;
    change(1, 1, n, s.second, inf);
    if (L[s.second] && R[s.second]) add(1, 1, n, L[s.second], R[s.second], -1);
    for (int v : G[s.second]) {
      add(1, 1, n, v, v, -1);
    }
    s = ask(1, 1, n, 1, n);
  }
  if (s.first != inf) return 0;
  return 1;
}
int main() {
  int T;
  scanf("%d", &T);
  while (T--) {
    scanf("%d", &n);
    build(1, 1, n);
    init();
    for (int i = 1; i <= n; i++) scanf("%d", nxt + i);
    for (int i = 1; i <= n; i++) L[i] = R[i] = 0;
    for (int i = 1; i <= n; i++)
      if (nxt[i] != -1 && nxt[i] != n + 1) {
        G[nxt[i]].push_back(i);
        L[i] = i + 1;
        R[i] = nxt[i] - 1;
        add(1, 1, n, L[i], R[i], 1);
        add(1, 1, n, i, i, 1);
      }
    for (int i = 1; i <= n; i++)
      if (nxt[i] == n + 1) {
        L[i] = i + 1;
        R[i] = n;
        add(1, 1, n, L[i], R[i], 1);
      }
    if (!topo())
      puts("-1");
    else {
      for (int i = 1; i <= n; i++) printf("%d ", ans[i]);
      puts("");
    }
  }
  return 0;
}
