#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
const int MAX = 5e5 + 5;
const long long MAX2 = 11;
const long long MOD = 1000000007;
const long long INF = 2e18;
const int dr[] = {1, 0, -1, 0, 1, 1, -1, -1, 0};
const int dc[] = {0, 1, 0, -1, 1, -1, 1, -1, 0};
const double pi = acos(-1);
const double EPS = 1e-9;
const int block = 450;
int tc, n, x[MAX], sz[MAX], nw, res[MAX], id, a, b, tree[1 << 20];
vector<int> v[MAX], ans;
stack<int> pq;
bool st;
void build(int id, int le, int ri) {
  if (le == ri) {
    tree[id] = res[le];
    return;
  }
  int mid = le + ri >> 1;
  build((id << 1), le, mid), build(((id << 1) | 1), mid + 1, ri);
  tree[id] = max(tree[(id << 1)], tree[((id << 1) | 1)]);
  return;
}
int que(int id, int le, int ri) {
  if (le > b || ri < a) return 0;
  if (le >= a && ri <= b) return tree[id];
  int mid = le + ri >> 1;
  return max(que((id << 1), le, mid), que(((id << 1) | 1), mid + 1, ri));
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> tc;
  while (tc--) {
    cin >> n;
    for (long long i = 1; i <= n + 1; ++i) v[i].clear(), sz[i] = 0;
    ans.clear();
    for (long long i = 1; i <= n; ++i) {
      cin >> x[i];
      if (x[i] == -1) continue;
      v[x[i]].push_back(-i), sz[i]++;
    }
    for (long long i = 1; i <= n + 1; ++i) sort(v[i].begin(), v[i].end());
    for (long long i = 1; i <= n; ++i)
      if (sz[i] == 0) {
        if (v[i].size() != 0)
          pq.push(i);
        else
          sz[i] = -1;
      }
    pq.push(n + 1);
    while (!pq.empty()) {
      nw = pq.top(), pq.pop();
      if (nw != n + 1) ans.push_back(nw);
      for (auto i : v[nw]) {
        i *= -1;
        sz[i]--;
        if (sz[i] == 0) pq.push(i);
      }
    }
    for (long long i = 1; i <= n; ++i)
      if (sz[i] == -1) ans.push_back(i);
    if (ans.size() != n)
      cout << "-1\n";
    else {
      id = n;
      for (auto i : ans) res[i] = id, --id;
      build(1, 1, n);
      st = 1;
      for (long long i = 1; i <= n; ++i) {
        if (x[i] == -1 || x[i] - 1 == i) continue;
        a = i + 1, b = x[i] - 1;
        if (que(1, 1, n) > res[i]) {
          st = 0;
          break;
        }
      }
      if (!st)
        cout << -1;
      else
        for (long long i = 1; i <= n; ++i) cout << res[i] << ' ';
      cout << "\n";
    }
  }
  return 0;
}
