#include <bits/stdc++.h>
#pragma GCC optimize(2)
template <typename T>
bool chkmax(T &x, T y) {
  return x < y ? x = y, true : false;
}
template <typename T>
bool chkmin(T &x, T y) {
  return x > y ? x = y, true : false;
}
using namespace std;
inline int read() {
  int x = 0;
  int f = 0;
  char ch = 0;
  while (!isdigit(ch)) {
    f |= (ch == '-') ? 1 : 0;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = (x << 3) + (x << 1) + (ch ^ 48);
    ch = getchar();
  }
  return f ? -x : x;
}
const int maxn = 5e5 + 10;
int t, n, aa[maxn];
int sum[maxn << 2];
inline void build(int rt, int l, int r) {
  sum[rt] = 0;
  if (l == r) {
    return;
  }
  int mid = (l + r) >> 1;
  build(rt << 1, l, mid);
  build(rt << 1 | 1, mid + 1, r);
}
inline void update(int rt, int x, int al, int ar, int k) {
  if (x > ar || x < al) return;
  if (al == ar) {
    sum[rt] = k;
    return;
  }
  int mid = (al + ar) >> 1;
  update(rt << 1, x, al, mid, k);
  update(rt << 1 | 1, x, mid + 1, ar, k);
  sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}
inline int query(int rt, int l, int r, int al, int ar) {
  if (l > ar || r < al) return 0;
  if (l <= al && r >= ar) {
    return sum[rt];
  }
  int mid = (al + ar) >> 1;
  return query(rt << 1, l, r, al, mid) + query(rt << 1 | 1, l, r, mid + 1, ar);
}
inline int query_min(int rt, int l, int r, int k) {
  if (l == r) {
    return l;
  }
  int mid = (l + r) >> 1;
  if (sum[rt << 1 | 1] >= k) return query_min(rt << 1 | 1, mid + 1, r, k);
  return query_min(rt << 1, l, mid, k - sum[rt << 1 | 1]);
}
set<int> sset[maxn];
int cur;
int ans[maxn];
inline void dfs(int u) {
  set<int>::iterator it;
  for (it = sset[u].begin(); it != sset[u].end(); ++it) {
    int v = *it;
    ans[v] = --cur;
    dfs(v);
  }
}
int main() {
  t = read();
  while (t--) {
    n = read();
    build(1, 1, n + 1);
    for (int i = 1; i <= n; ++i) aa[i] = read();
    for (int i = 1; i <= n + 1; ++i) sset[i].clear();
    int flag = 0;
    for (int i = 1; i <= n; ++i) {
      int tmp = query(1, i + 1, n + 1, 1, n + 1);
      int tmp1 = query_min(1, 1, n + 1, tmp);
      if (aa[i] == -1) {
        aa[i] = tmp1;
      } else {
        if (aa[i] > tmp1) {
          flag = 1;
          break;
        }
        update(1, aa[i], 1, n + 1, 1);
      }
    }
    if (flag) {
      printf("-1\n");
      continue;
    }
    for (int i = 1; i <= n; ++i) {
      sset[aa[i]].insert(i);
    }
    cur = n + 1;
    dfs(n + 1);
    for (int i = 1; i <= n; ++i) {
      if (i != 1) printf(" ");
      printf("%d", ans[i]);
    }
    printf("\n");
  }
}
