#include <bits/stdc++.h>
#define MAXN ((int) 3e5)
using namespace std;
int n;
long long ans;
vector<int> e[MAXN + 10];
// mino:区间最小值
// cnto:区间里等于最小值的元素数量
int mino[MAXN * 4 + 10], cnto[MAXN * 4 + 10], lazy[MAXN * 4 + 10];
void maintain(int id) {
int nxt = id << 1;
mino[id] = min(mino[nxt], mino[nxt | 1]);
cnto[id] = 0;
if (mino[id] == mino[nxt]) cnto[id] += cnto[nxt];
if (mino[id] == mino[nxt | 1]) cnto[id] += cnto[nxt | 1];
}
void build(int id, int l, int r) {
lazy[id] = 0;
if (l == r) mino[id] = 0, cnto[id] = 1;
else {
int nxt = id << 1, mid = (l + r) >> 1;
build(nxt, l, mid); build(nxt | 1, mid + 1, r);
maintain(id);
}
}
void down(int id) {
int nxt = id << 1;
mino[nxt] += lazy[id]; lazy[nxt] += lazy[id];
mino[nxt | 1] += lazy[id]; lazy[nxt | 1] += lazy[id];
lazy[id] = 0;
}
// 给区间 [ql, qr] 的每个元素加上 val
void add(int id, int l, int r, int ql, int qr, int val) {
if (ql <= l && r <= qr) mino[id] += val, lazy[id] += val;
else {
if (lazy[id]) down(id);
int nxt = id << 1, mid = (l + r) >> 1;
if (ql <= mid) add(nxt, l, mid, ql, qr, val);
if (qr > mid) add(nxt | 1, mid + 1, r, ql, qr, val);
maintain(id);
}
}
// 询问区间 [ql, qr] 中 1 有几个,保证每个元素都至少是 1
int query(int id, int l, int r, int ql, int qr) {
if (ql <= l && r <= qr) return mino[id] == 1 ? cnto[id] : 0;
else {
if (lazy[id]) down(id);
int nxt = id << 1, mid = (l + r) >> 1;
return
(ql <= mid ? query(nxt, l, mid, ql, qr) : 0) +
(qr > mid ? query(nxt | 1, mid + 1, r, ql, qr) : 0);
}
}
void solve() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) e[i].clear();
for (int i = 1; i < n; i++) {
int x, y; scanf("%d%d", &x, &y);
e[x].push_back(y);
e[y].push_back(x);
}
build(1, 1, n);
ans = 0;
for (int sn = 1; sn <= n; sn++) {
// sn 自己是一个新的连通块
add(1, 1, n, 1, sn, 1);
// fn 将会对所有 l <= fn 的 f(l, sn) 产生贡献
for (int fn : e[sn]) if (fn < sn) add(1, 1, n, 1, fn, -1);
// 询问有几个 l 满足 f(l, sn) == 1
ans += query(1, 1, n, 1, sn);
}
printf("%lld\n", ans);
}
int main() {
int tcase; scanf("%d", &tcase);
while (tcase--) solve();
return 0;
}