import unittest
from package_identity import select_installed

ROW = 'libnvidia-decode-595:{0}\t595.71.05\t{0}\tinstall ok installed\n'

class IdentityTests(unittest.TestCase):
    def test_native_from_two_records(self):
        self.assertEqual(select_installed(ROW.format('amd64') + ROW.format('i386'), 'libnvidia-decode-595', 'amd64')[0], 'libnvidia-decode-595:amd64')

    def test_explicit_32_bit(self):
        self.assertEqual(select_installed(ROW.format('amd64') + ROW.format('i386'), 'libnvidia-decode-595:i386', 'amd64')[0], 'libnvidia-decode-595:i386')

    def test_architecture_all(self):
        self.assertEqual(select_installed('common\t1\tall\tinstall ok installed\n', 'common', 'amd64')[0], 'common')

    def test_duplicate_is_rejected(self):
        with self.assertRaises(ValueError):
            select_installed(ROW.format('amd64') * 2, 'libnvidia-decode-595', 'amd64')

    def test_missing_architecture_is_rejected(self):
        with self.assertRaises(ValueError):
            select_installed(ROW.format('i386'), 'libnvidia-decode-595', 'amd64')

    def test_incomplete_install_is_rejected(self):
        with self.assertRaises(ValueError):
            select_installed(ROW.format('amd64').replace('install ok installed', 'install ok unpacked'), 'libnvidia-decode-595', 'amd64')

    def test_wrong_name_is_rejected(self):
        with self.assertRaises(ValueError):
            select_installed(ROW.format('amd64'), 'different', 'amd64')

    def test_repeated_requests_do_not_duplicate_backup(self):
        result = {}
        text = ROW.format('amd64') + ROW.format('i386')
        for name in ('libnvidia-decode-595', 'libnvidia-decode-595:i386', 'libnvidia-decode-595'):
            key, value = select_installed(text, name, 'amd64')
            result[key] = value
        self.assertEqual(len(result), 2)

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