#include <bits/stdc++.h>
using namespace std;
struct node {
  int si, ei;
  pair<int, int> v;
  int lz;
  node(int sii, int eii, pair<int, int> vv, int lzz) {
    si = sii;
    ei = eii;
    v = vv;
    lz = lzz;
  }
  node() {
    si = ei = lz = 0;
    v = make_pair(0, 0);
  }
};
struct seg_tree {
  node nd[3 * 500009];
  void init(int in, int s, int e) {
    node &n = nd[in];
    if (s == e) {
      n = node(s, e, make_pair(s, 0), 0);
      return;
    }
    int mid = (s + e) / 2;
    init(2 * in, s, mid);
    init(2 * in + 1, mid + 1, e);
    n = merge(nd[2 * in], nd[2 * in + 1]);
  }
  void prop(int in) {
    node &n = nd[in];
    n.v.second += n.lz;
    if (n.si != n.ei) {
      nd[2 * in].lz += n.lz;
      nd[2 * in + 1].lz += n.lz;
    }
    n.lz = 0;
  }
  pair<int, int> _min(pair<int, int> a, pair<int, int> b) {
    if (a.second < b.second) return a;
    return b;
  }
  node merge(node a, node b) { return node(a.si, b.ei, _min(a.v, b.v), 0); }
  void upd_lz(node &n, int lz) { n.lz += lz; }
  node query_p(int in, int i) {
    prop(in);
    node &n = nd[in];
    if (n.si == n.ei) {
      return n;
    }
    int mid = (n.si + n.ei) / 2;
    return (i <= mid) ? query_p(2 * in, i) : query_p(2 * in + 1, i);
  }
  node query_r(int in, int s, int e) {
    prop(in);
    node &n = nd[in];
    if (n.si == s && n.ei == e) return n;
    int mid = (n.si + n.ei) / 2;
    if (e <= mid)
      return query_r(2 * in, s, e);
    else if (s > mid)
      return query_r(2 * in + 1, s, e);
    else
      return merge(query_r(2 * in, s, mid), query_r(2 * in + 1, mid + 1, e));
  }
  void update_r(int in, int s, int e, int v) {
    node &n = nd[in];
    if (n.si == s && n.ei == e) {
      upd_lz(n, v);
      return;
    }
    prop(in);
    int mid = (n.si + n.ei) / 2;
    if (e <= mid)
      update_r(2 * in, s, e, v);
    else if (s > mid)
      update_r(2 * in + 1, s, e, v);
    else {
      update_r(2 * in, s, mid, v);
      update_r(2 * in + 1, mid + 1, e, v);
    }
    prop(2 * in);
    prop(2 * in + 1);
    n = merge(nd[2 * in], nd[2 * in + 1]);
  }
};
int p[500009];
seg_tree st;
vector<int> nds, out[500009];
int ans[500009];
int INF = 10000000;
inline int readInteger(int &n) {
  n = 0;
  int neg = 0;
  char c = getchar();
  if (c == '-') neg = 1;
  while (c < '0' || c > '9') {
    c = getchar();
    if (c == '-') neg = 1;
  }
  while (c >= '0' && c <= '9') {
    n = (n << 3) + (n << 1) + c - '0';
    c = getchar();
  }
  if (neg) n = -n;
  return n;
}
inline void print(int a) {
  if (a < 0) {
    a = -a;
    putchar('-');
  }
  char snum[20];
  int i = 0;
  do {
    snum[i++] = a % 10 + 48;
    a = a / 10;
  } while (a != 0);
  i = i - 1;
  while (i >= 0) putchar(snum[i--]);
  putchar(' ');
}
int main() {
  int t;
  cin >> t;
  while (t--) {
    int n;
    cin >> n;
    st.init(1, 1, n);
    nds.clear();
    for (int i = 1; i <= n; i++) out[i].clear();
    for (int i = 1; i <= n; i++) {
      readInteger(p[i]);
      if (p[i] == -1) continue;
      if (p[i] <= n) {
        st.update_r(1, i, i, 1);
        out[p[i]].push_back(i);
      }
      if (i + 1 < p[i]) {
        st.update_r(1, i + 1, p[i] - 1, 1);
      }
    }
    bool noans = false;
    while (true) {
      if (nds.size() == n) {
        break;
      }
      pair<int, int> nd = st.query_r(1, 1, n).v;
      int i = nd.first;
      if (nd.second != 0) {
        noans = true;
        break;
      }
      nds.push_back(i);
      st.update_r(1, i, i, INF);
      for (int v : out[i]) {
        st.update_r(1, v, v, -1);
      }
      if (i + 1 < p[i]) {
        st.update_r(1, i + 1, p[i] - 1, -1);
      }
    }
    if (noans) {
      printf("-1\n");
      continue;
    }
    for (int i = 0; i < n; i++) {
      ans[nds[i]] = n - i;
    }
    for (int i = 1; i <= n; i++) {
      print(ans[i]);
    }
    printf("\n");
  }
}
