description: Monocarp is the coach of the Berland State University programming teams. He decided to compose a problemset for a training session for his teams.
  
  Monocarp has n problems that none of his students have seen yet. The i-th problem has a topic a_i (an integer from 1 to n) and a difficulty b_i (an integer from 1 to n). All problems are different, that is, there are no two tasks that have the same topic and difficulty at the same time.
  
  Monocarp decided to select exactly 3 problems from n problems for the problemset. The problems should satisfy at least one of two conditions (possibly, both):
  
    * the topics of all three selected problems are different; 
    * the difficulties of all three selected problems are different. 
  
  
  
  Your task is to determine the number of ways to select three problems for the problemset.
  
  Input
  
  The first line contains a single integer t (1 ≤ t ≤ 50000) — the number of testcases.
  
  The first line of each testcase contains an integer n (3 ≤ n ≤ 2 ⋅ 10^5) — the number of problems that Monocarp have.
  
  In the i-th of the following n lines, there are two integers a_i and b_i (1 ≤ a_i, b_i ≤ n) — the topic and the difficulty of the i-th problem.
  
  It is guaranteed that there are no two problems that have the same topic and difficulty at the same time.
  
  The sum of n over all testcases doesn't exceed 2 ⋅ 10^5.
  
  Output
  
  Print the number of ways to select three training problems that meet either of the requirements described in the statement.
  
  Example
  
  Input
  
  
  2
  4
  2 4
  3 4
  2 1
  1 3
  5
  1 5
  2 4
  3 3
  4 2
  5 1
  
  
  Output
  
  
  3
  10
  
  Note
  
  In the first example, you can take the following sets of three problems:
  
    * problems 1, 2, 4; 
    * problems 1, 3, 4; 
    * problems 2, 3, 4. 
  
  
  
  Thus, the number of ways is equal to three.
solution: from collections import defaultdict, deque, Counter
  from heapq import heapify, heappop, heappush
  import math
  from copy import deepcopy
  from itertools import combinations, permutations, product, combinations_with_replacement
  from bisect import bisect_left, bisect_right
  
  import sys
  
  def input():
      return sys.stdin.readline().rstrip()
  def getN():
      return int(input())
  def getNM():
      return map(int, input().split())
  def getList():
      return list(map(int, input().split()))
  def getListGraph():
      return list(map(lambda x:int(x) - 1, input().split()))
  def getArray(intn):
      return [int(input()) for i in range(intn)]
  
  mod = 10 ** 9 + 7
  MOD = 998244353
  # sys.setrecursionlimit(1000000)
  inf = float('inf')
  eps = 10 ** (-10)
  dy = [0, 1, 0, -1]
  dx = [1, 0, -1, 0]
  
  #############
  # Main Code #
  #############
  
  T = getN()
  for i in range(T):
      N = getN()
      a_cnt = [0] * (N + 1)
      b_cnt = [0] * (N + 1)
  
      B = []
      for i in range(N):
          a, b = getNM()
          a_cnt[a] += 1
          b_cnt[b] += 1
          B.append([a, b])
  
      # 全体からAnBを引けばいい
      all = N * (N - 1) * (N - 2) // 6
      cap = 0
      for i in range(N):
          cap += (a_cnt[B[i][0]] - 1) * (b_cnt[B[i][1]] - 1)
  
      print(all - cap)