#include <bits/stdc++.h>
using namespace std;
template <typename T>
void chkmax(T &x, T y) {
  x = x > y ? x : y;
}
template <typename T>
void chkmin(T &x, T y) {
  x = x > y ? y : x;
}
const long long INF = (1ll << 62) - 1;
template <typename T>
void read(T &x) {
  x = 0;
  bool f = 1;
  char ch;
  do {
    ch = getchar();
    if (ch == '-') f = 0;
  } while (ch > '9' || ch < '0');
  do {
    x = x * 10 + ch - '0';
    ch = getchar();
  } while (ch >= '0' && ch <= '9');
  x = f ? x : -x;
}
template <typename T>
void write(T x) {
  if (x < 0) x = ~x + 1, putchar('-');
  if (x > 9) write(x / 10);
  putchar(x % 10 + '0');
}
const int N = 2e6 + 7;
struct EDGE {
  int to, nxt;
} edge[N << 2];
struct Segment_Tree {
  int l, r;
} t[N];
int T, n, p, E, d[N], V[N], in[N], val[N], nxt[N], head[N];
inline void addedge(int u, int v) {
  edge[++E].to = v;
  edge[E].nxt = head[u];
  head[u] = E;
  d[v]++;
}
inline void build(int p, int l, int r) {
  t[p].l = l;
  t[p].r = r;
  if (l == r) {
    in[l] = p;
    V[p] = l;
    return;
  }
  int mid = (t[p].l + t[p].r) >> 1;
  build((p << 1), l, mid);
  build((p << 1 | 1), mid + 1, r);
  addedge((p << 1), p);
  addedge((p << 1 | 1), p);
}
inline void modify(int p, int u, int l, int r) {
  if (r < l) return;
  if (l <= t[p].l && t[p].r <= r) {
    addedge(p, u);
    return;
  }
  int mid = (t[p].l + t[p].r) >> 1;
  if (l <= mid) modify((p << 1), u, l, r);
  if (r > mid) modify((p << 1 | 1), u, l, r);
}
inline void clear() {
  for (int i = 0; i <= 4 * n; i++)
    t[i].l = t[i].r = d[i] = V[i] = head[i] = in[i] = d[i] = 0;
  E = p = 0;
}
inline void solve() {
  clear();
  read(n);
  build(1, 1, n);
  for (int i = 1; i <= n; i++) read(nxt[i]);
  for (int i = 1; i <= n; i++) {
    if (nxt[i] == -1) {
      nxt[i] = i + 1;
    }
    if (nxt[i] != n + 1) addedge(in[i], in[nxt[i]]);
    modify(1, in[i], i + 1, nxt[i] - 1);
  }
  queue<int> q;
  while (!q.empty()) q.pop();
  for (int i = 1; i <= n; i++)
    if (!d[in[i]]) q.push(in[i]);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    if (V[u]) val[V[u]] = ++p;
    for (int i = head[u]; i; i = edge[i].nxt) {
      int v = edge[i].to;
      d[v]--;
      if (!d[v]) q.push(v);
    }
  }
  if (p != n) return (void)puts("-1");
  for (int i = 1; i <= n; i++) printf("%d ", val[i]);
  puts("");
}
int main() {
  read(T);
  while (T--) solve();
  return 0;
}
