#include <bits/stdc++.h>
using namespace std;
template <class T>
bool umin(T& a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
bool umax(T& a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
vector<int> adj[500009 * 5];
int deg[500009 * 5], node, ans[500009], n;
void add(int x, int y) {
  adj[y].push_back(x);
  deg[x]++;
}
void upd(int l, int r, int nd, int x, int y) {
  if (l > r or l > y or x > r) return;
  if (l <= x and y <= r) {
    add(l - 1, nd + n);
    return;
  }
  int mid = (x + y) >> 1;
  upd(l, r, nd << 1, x, mid);
  upd(l, r, nd << 1 | 1, mid + 1, y);
}
void build(int nd, int x, int y) {
  for (int i = x; i <= y; i++) add(nd + n, i);
  umax(node, nd + n);
  if (x == y) return;
  int mid = (x + y) >> 1;
  build(nd << 1, x, mid);
  build(nd << 1 | 1, mid + 1, y);
}
int main() {
  int t;
  scanf("%d", &t);
  while (t--) {
    scanf("%d", &n);
    build(1, 1, n);
    for (int i = 1; i <= n; i++) {
      int x;
      scanf("%d", &x);
      if (x == -1) continue;
      if (x <= n) add(x, i);
      upd(i + 1, x - 1, 1, 1, n);
    }
    queue<int> q;
    for (int i = 1; i <= node; i++)
      if (!deg[i]) q.push(i);
    int res = 0;
    while (!q.empty()) {
      int nd = q.front();
      q.pop();
      if (nd <= n) ans[nd] = ++res;
      for (__typeof((adj[nd]).begin()) it = (adj[nd]).begin();
           it != (adj[nd]).end(); it++)
        if (!(--deg[*it])) q.push(*it);
    }
    if (res != n)
      puts("-1");
    else {
      for (int i = 1; i <= n; i++) printf("%d ", ans[i]);
      puts("");
    }
    for (int i = 0; i <= node; i++) deg[i] = 0, adj[i].clear();
    node = 0;
  }
  return 0;
}
