import unittest
import xraylib

class TestNISTCompounds(unittest.TestCase):
    def test_good(self):
        list = xraylib.GetCompoundDataNISTList()
        self.assertEqual(len(list), 180)
        for i, v in enumerate(list):
            cdn = xraylib.GetCompoundDataNISTByIndex(i)
            self.assertEqual(cdn['name'], v)
            cdn = xraylib.GetCompoundDataNISTByName(v)
            self.assertEqual(cdn['name'], v)

        cdn = xraylib.GetCompoundDataNISTByIndex(5)
        self.assertEqual(cdn['nElements'], 4)
        self.assertEqual(cdn['density'], 0.001205)
        self.assertEqual(cdn['Elements'], (6, 7, 8, 18))
        self.assertAlmostEqual(cdn['massFractions'], (0.000124, 0.755267, 0.231781, 0.012827))
        self.assertEqual(cdn['name'], 'Air, Dry (near sea level)')

        cdn = xraylib.GetCompoundDataNISTByName('Air, Dry (near sea level)')
        self.assertEqual(cdn['nElements'], 4)
        self.assertEqual(cdn['density'], 0.001205)
        self.assertEqual(cdn['Elements'], (6, 7, 8, 18))
        self.assertAlmostEqual(cdn['massFractions'], (0.000124, 0.755267, 0.231781, 0.012827))
        self.assertEqual(cdn['name'], 'Air, Dry (near sea level)')

    def test_bad(self):
        with self.assertRaises(ValueError):
            xraylib.GetCompoundDataNISTByName("jwjfpfj")
        with self.assertRaises(TypeError):
            xraylib.GetCompoundDataNISTByName(0)
        with self.assertRaises(ValueError):
            xraylib.GetCompoundDataNISTByName(None)
        with self.assertRaises(ValueError):
            xraylib.GetCompoundDataNISTByIndex(-1)
        with self.assertRaises(ValueError):
            xraylib.GetCompoundDataNISTByIndex(180)
        with self.assertRaises(TypeError):
            xraylib.GetCompoundDataNISTByIndex(None)
        with self.assertRaises(TypeError):
            xraylib.GetCompoundDataNISTByIndex("jpwjfpfwj")

if __name__ == '__main__':
    unittest.main(verbosity=2)
