def test_add(self):
        # Tests some binary function evaluations
        x = nd.add(2, 3)
        self.assertEqual(x.vals().dtype, nd.int32)
        self.assertEqual(x.as_py(), 5)

        x = nd.add(nd.arange(4), 3)
        self.assertEqual(x.vals().dtype, nd.int32)
        self.assertEqual(x.as_py(), [3,4,5,6])

        x = nd.add(2, nd.arange(4))
        self.assertEqual(x.vals().dtype, nd.int32)
        self.assertEqual(x.as_py(), [2,3,4,5])

        x = nd.add(nd.arange(4), nd.arange(4))
        self.assertEqual(x.vals().dtype, nd.int32)
        self.assertEqual(x.as_py(), [0,2,4,6])

        x = nd.add(nd.arange(4).as_dtype(nd.float64), 3.5)
        self.assertEqual(x.vals().dtype, nd.float64)
        self.assertEqual(x.as_py(), [3.5,4.5,5.5,6.5])

        x = nd.add(nd.arange(4).as_dtype(nd.float64),
                nd.arange(4).as_dtype(nd.float64)).as_dtype(nd.int16)
        self.assertEqual(x.vals().dtype, nd.int16)
        self.assertEqual(x.as_py(), [0,2,4,6])
    def test_square(self):
        # Tests some unary function evaluations
        x = nd.square(2)
        self.assertEqual(x.vals().dtype, nd.int32)
        self.assertEqual(x.as_py(), 4)

        x = nd.square(nd.arange(4))
        self.assertEqual(x.vals().dtype, nd.int32)
        self.assertEqual(x.as_py(), [0,1,4,9])

        x = nd.square(nd.arange(4).as_dtype(nd.float32)).as_dtype(nd.float64)
        self.assertEqual(x.vals().dtype, nd.float64)
        self.assertEqual(x.as_py(), [0.,1.,4.,9.])

        x = nd.square(nd.arange(4).as_dtype(nd.float32)).as_dtype(nd.float64)
        x = nd.square(x).as_dtype(nd.int64)
        self.assertEqual(x.vals().dtype, nd.int64)
        self.assertEqual(x.as_py(), [0,1,16,81])