#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
long double PI = acosl(-1);
const int inf = 1e7;
const int nmax = 5e5 + 10;
const int MAXLG = log2(nmax) + 1;
int bst[4 * nmax], ans[nmax];
vector<int> g[nmax];
int query(int a, int L, int R, int l, int r) {
  if (l > r or l > R or L > r) return 0;
  if (l <= L and R <= r) return bst[a];
  int mid = (L + R) / 2;
  return query(2 * a, L, mid, l, r) + query(2 * a + 1, mid + 1, R, l, r);
}
void update(int a, int L, int R, int pos) {
  if (pos < L or pos > R or L > R) return;
  if (L == R and L == pos) {
    bst[a]++;
    return;
  }
  int mid = (L + R) / 2;
  update(2 * a, L, mid, pos);
  update(2 * a + 1, mid + 1, R, pos);
  bst[a] = bst[2 * a] + bst[2 * a + 1];
}
inline void porishkar(int n) {
  for (int i = 1; i <= n + 1; i++) g[i].clear(), ans[i] = 0;
  for (int i = 1; i <= 4 * (n + 1); i++) bst[i] = 0;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int t;
  cin >> t;
  while (t--) {
    int n;
    cin >> n;
    int hui = n;
    porishkar(n);
    for (int i = 1; i <= n; i++) {
      int x;
      cin >> x;
      if (x == -1)
        g[i + 1].push_back(i);
      else
        g[x].push_back(i);
    }
    for (int i = 1; i <= n + 1; i++) sort(g[i].begin(), g[i].end());
    queue<int> q;
    q.push(n + 1);
    bool hobena = false;
    while (!q.empty()) {
      int u = q.front();
      q.pop();
      for (int v : g[u])
        if (query(1, 1, n, v + 1, u - 1))
          hobena = true;
        else
          update(1, 1, n, v), ans[v] = hui--, q.push(v);
    }
    if (hobena)
      cout << "-1\n";
    else {
      for (int i = 1; i <= n; i++) cout << ans[i] << " ";
      cout << "\n";
    }
  }
}
