#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXN 1002
#define memset0(a) memset(a,0,sizeof(a))
#define EPS 1e-8
struct Pt//point 点的结构
{
int x, y;
Pt() {}
Pt(int x, int y) :x(x), y(y) {}
bool operator<(const Pt &b)const
{
return y != b.y ? y < b.y : x < b.x;//y坐标升序优先 x坐标升序其次
}
} pts[MAXN];
int N;//点总数
int fun()
{
for (int p = 0; p < N; p++)
scanf("%d%d", &pts[p].x, &pts[p].y);//input
sort(pts, pts + N);//排序 方便二分
int ans = 0;
for (int p = 0; p < N; p++)//枚举第一个点
for (int i = p + 1; i < N; i++) //枚举另一个点画对角线
{
Pt p2(pts[p].x + pts[i].x - pts[p].y + pts[i].y, pts[p].x - pts[i].x + pts[p].y + pts[i].y);//point_2 额认为前面枚举的一个是点1 一个是点3 计算所得的点2的坐标是实际的二倍 因为还得判断有无小数
if (!(p2.x & 1) && !(p2.y & 1)) //如果点2的横坐标或纵坐标带小数 由于输入都是整数 显然不会存在
{
p2.x /= 2, p2.y /= 2;//这时点2坐标才正确
Pt p4((pts[p].y - pts[i].y + pts[p].x + pts[i].x) / 2, (pts[p].y + pts[i].y - pts[p].x + pts[i].x) / 2);//算出点4坐标
ans += binary_search(pts, pts + N, p2) && binary_search(pts, pts + N, p4);
}
}
return ans / 2;//同一个正方形的两条对角线都会被枚举一次 因而除以2
}
int main(void)
{
int i,m;
scanf("%d", &m);
for(i=0; i<m; i++)
{
scanf("%d", &N);
if(i!=m-1)
printf("%d\n", fun());//output
else
printf("%d", fun());
}
}