#include <bits/stdc++.h>
using namespace std;
#define N 10
#define INF 0x3f3f3f3f
struct node {
int l, t, r, b;
int x[2], y[2];
void input() {
scanf("%d %d %d %d", x, y, x + 1, y + 1);
}
bool in(int _x, int _y) {
return x[0] < _x && _x < x[1] && y[0] < _y && _y < y[1];
}
} a[N * N];
struct Hash {
int cnt, a[N];
void Init() {
cnt = 0;
}
void add(int x) {
a[++cnt] = x;
}
void work() {
sort(a + 1, a + 1 + cnt);
cnt = unique(a + 1, a + 1 + cnt) - a - 1;
}
int get(int x) {
return lower_bound(a + 1, a + 1 + cnt, x) - a;
}
} hx, hy;
int vis[N][N];
int dir[4][2] = {1, 0, 0, 1, -1, 0,0, -1};
bool check(int x, int y, int dx, int dy) {
if (x == dx) {
for (int i = 0; i < 2; ++i) {
if ( x == a[i].x[0] || x == a[i].x[1]) {
if (a[i].y[0] <= y && dy <= a[i].y[1]) {
return false;
}
}
}
} else {
for (int i = 0; i < 2; ++i) {
if (y == a[i].y[0] || y == a[i].y[1]) {
if (a[i].x[0] <= x && dx <= a[i].x[1]) {
return false;
}
}
}
}
return true;
}
bool judge(int x, int y, int d) {
if (d == 0) {
return check(x + 1, y, x + 1, y + 1);
} else if (d == 1) {
return check(x, y + 1, x + 1, y + 1);
} else if (d == 2) {
return check(x, y, x, y + 1);
} else {
return check(x, y, x + 1, y);
}
}
void DFS(int x, int y) {
vis[x][y] = 1;
for (int i = 0; i < 4; ++i) {
int dx = x + dir[i][0];
int dy = y + dir[i][1];
if (dx >= 1 && dx < hx.cnt && dy >= 1 && dy < hy.cnt) {
if (!vis[dx][dy] && judge(x, y, i)) {
DFS(dx, dy);
}
}
}
}
int main() {
#ifdef LOCAL_JUDGE
freopen("input.txt", "r", stdin);
#endif
int T;
scanf("%d", &T);
while (T--) {
a[0].input();
a[1].input();
hx.Init(), hy.Init();
hx.add(-INF), hx.add(INF);
hx.add(a[0].x[0]), hx.add(a[0].x[1]);
hx.add(a[1].x[0]), hx.add(a[1].x[1]);
hy.add(-INF), hy.add(INF);
hy.add(a[0].y[0]), hy.add(a[0].y[1]);
hy.add(a[1].y[0]), hy.add(a[1].y[1]);
hx.work(), hy.work();
for (int i = 0; i < 2; ++i) {
a[i].x[0] = hx.get(a[i].x[0]);
a[i].x[1] = hx.get(a[i].x[1]);
a[i].y[0] = hy.get(a[i].y[0]);
a[i].y[1] = hy.get(a[i].y[1]);
}
memset(vis, 0, sizeof vis);
int res = 0;
for (int i = 1; i < hx.cnt; ++i) {
for (int j = 1; j < hy.cnt; ++j) {
if (!vis[i][j]) {
DFS(i, j);
res++;
}
}
}
printf("%d\n", res);
}
return 0;
}