#include <bits/stdc++.h>
using namespace std;
using LL = long long;
const int MAXN(5e5 + 100);
struct Node {
  int left, right, val, lazy;
} tree[MAXN << 2];
int n, nx[MAXN], in[MAXN], ans[MAXN];
vector<int> G[MAXN];
inline int read() {
  int f = 1, x = 0;
  char ch;
  do {
    ch = getchar();
    if (ch == '-') f = -1;
  } while (ch < '0' || ch > '9');
  do {
    x = x * 10 + ch - '0';
    ch = getchar();
  } while (ch >= '0' && ch <= '9');
  return f * x;
}
void pushdown(int v) {
  if (tree[v].lazy) {
    tree[(v << 1)].val = tree[(v << 1)].lazy = tree[v].lazy;
    tree[(v << 1 | 1)].val = tree[(v << 1 | 1)].lazy = tree[v].lazy;
  }
  tree[v].lazy = 0;
}
void build(int l, int r, int v) {
  tree[v].left = l;
  tree[v].right = r;
  tree[v].val = tree[v].lazy = 0;
  if (l == r) return;
  int mid = (l + r) >> 1;
  build(l, mid, (v << 1));
  build(mid + 1, r, (v << 1 | 1));
}
void update(int l, int r, int v, int x) {
  if (l == tree[v].left && r == tree[v].right) {
    tree[v].val = tree[v].lazy = x;
    return;
  }
  pushdown(v);
  if (l <= tree[(v << 1)].right) {
    if (r <= tree[(v << 1)].right)
      update(l, r, (v << 1), x);
    else
      update(l, tree[(v << 1)].right, (v << 1), x);
  }
  if (r >= tree[(v << 1 | 1)].left) {
    if (l >= tree[(v << 1 | 1)].left)
      update(l, r, (v << 1 | 1), x);
    else
      update(tree[(v << 1 | 1)].left, r, (v << 1 | 1), x);
  }
}
int query(int v, int pos) {
  while (tree[v].left != tree[v].right) {
    pushdown(v);
    if (pos <= tree[(v << 1)].right)
      v = (v << 1);
    else
      v = (v << 1 | 1);
  }
  return tree[v].val;
}
void addedge(int u, int v) {
  G[u].push_back(v);
  in[v]++;
}
bool toposort() {
  int ct = 0;
  queue<int> que;
  for (int i = 1; i <= n; i++)
    if (!in[i]) que.push(i);
  while (!que.empty()) {
    int u = que.front();
    que.pop();
    ans[u] = ++ct;
    for (int v : G[u]) {
      in[v]--;
      if (!in[v]) que.push(v);
    }
  }
  for (int i = 1; i <= n; i++)
    if (!ans[i] && !in[i]) ans[i] = ++ct;
  return ct == n;
}
void init() {
  n = read();
  fill(in, in + n + 10, 0);
  fill(ans, ans + n + 10, 0);
  for (int i = 1; i <= n; i++) {
    nx[i] = read();
    G[i].clear();
  }
  build(1, n, 1);
}
void solve() {
  for (int i = 1; i <= n; i++) {
    if (nx[i] - i >= 2) update(i + 1, nx[i] - 1, 1, i);
    if (nx[i] != -1 && nx[i] <= n) addedge(i, nx[i]);
    int pre = query(1, i);
    if (pre) addedge(i, pre);
  }
  if (toposort())
    for (int i = 1; i <= n; i++) printf("%d%c", ans[i], i < n ? ' ' : '\n');
  else
    printf("-1\n");
}
int main() {
  int t = read();
  while (t--) {
    init();
    solve();
  }
}
