class TestKDTree(unittest.TestCase):
    def setUp(self):
        self.tree1 = KDTree([[2, 3], [5, 4], [9, 6], [4, 7], [8, 1], [7, 2]],
                            leaf_size=1)
        self.tree2 = KDTree([[2, 3], [5, 4], [9, 6], [4, 7], [8, 1], [7, 2]],
                            leaf_size=2)

    def test_build(self):
        self.tree1.print()
        self.tree2.print()

    def test_query(self):
        self.assertTrue(np.array_equal(self.tree1.query([4, 5], 1), [1]))
        self.assertTrue(np.array_equal(self.tree1.query([4, 5], 2), [3, 1]))
        ind, dist = self.tree2.query([4, 5], 1, return_distance=True)
        self.assertTrue(np.array_equal(ind, [1]))
        self.assertEqual(dist, [np.sqrt(2)])
        self.assertTrue(
            np.array_equal(self.tree2.query([4, 5], 2, sort_results=True),
                           [1, 3]))

    def test_query_radius(self):
        self.assertTrue(
            np.array_equal(self.tree1.query_radius([7, 4], 3), [2, 5, 1]))
        self.assertTrue(
            np.array_equal(self.tree1.query_radius([7, 4], 3, count_only=True),
                           3))
        ind, dist = self.tree2.query_radius([7, 4], 3, return_distance=True)
        self.assertTrue(np.array_equal(ind, [2, 5, 1]))
        self.assertEqual(dist, [np.sqrt(8), 2, 2])
        self.assertTrue(
            np.array_equal(
                self.tree2.query_radius([7, 4], 3, sort_results=True),
                [5, 1, 2]))