#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void checkmin(T &a, T b) {
  if (b < a) a = b;
}
template <class T>
inline void checkmax(T &a, T b) {
  if (b > a) a = b;
}
int T, N;
int onxt[500202];
int nnxt[500202];
int a[500202];
bool check() {
  map<int, int> mi;
  mi[N + 1] = N + 1;
  for (int i = ((N)-1); i >= (int)(0); i--) {
    auto it = mi.lower_bound(a[i]);
    if (onxt[i] == -1 || it->second == onxt[i]) {
    } else
      return false;
    while (!mi.empty()) {
      if (mi.begin()->first < a[i])
        mi.erase(mi.begin());
      else
        break;
    }
    mi[a[i]] = i + 1;
  }
  return true;
}
int main() {
  scanf("%d", &T);
  while (T--) {
    scanf("%d", &N);
    for (int i = (0); i < (int)(N); i++)
      scanf("%d", onxt + i), nnxt[i] = onxt[i];
    set<int> si;
    for (int i = (0); i < (int)(N); i++) {
      if (onxt[i] == -1) {
        nnxt[i] = N + 1;
        auto it = si.upper_bound(i + 1);
        if (it != si.end()) checkmin(nnxt[i], *it);
      } else {
        si.insert(onxt[i]);
      }
    }
    vector<pair<int, int> > vp;
    for (int i = (0); i < (int)(N); i++) vp.push_back(make_pair(-nnxt[i], i));
    sort((vp).begin(), (vp).end());
    int t = N;
    for (auto &it : vp) {
      a[it.second] = t--;
    }
    if (check()) {
      for (int i = (0); i < (int)(N - 1); i++) printf("%d ", a[i]);
      printf("%d\n", a[N - 1]);
    } else {
      printf("-1\n");
    }
  }
}
