from django.test import TestCase

from dcim.models import Device, DeviceRole, DeviceType, Interface, Manufacturer, Site


class NaturalOrderingTestCase(TestCase):

    @classmethod
    def setUpTestData(cls):

        site = Site.objects.create(name='Test Site 1', slug='test-site-1')
        manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
        devicetype = DeviceType.objects.create(
            manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
        )
        role = DeviceRole.objects.create(
            name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
        )
        Device.objects.create(
            device_type=devicetype, role=role, name='Test Device 1', site=site
        )

    def test_interface_ordering_numeric(self):
        device = Device.objects.first()
        INTERFACES = [
            '0',
            '0.0',
            '0.1',
            '0.2',
            '0.10',
            '0.100',
            '0:1',
            '0:1.0',
            '0:1.1',
            '0:1.2',
            '0:1.10',
            '0:2',
            '0:2.0',
            '0:2.1',
            '0:2.2',
            '0:2.10',
            '1',
            '1.0',
            '1.1',
            '1.2',
            '1.10',
            '1.100',
            '1:1',
            '1:1.0',
            '1:1.1',
            '1:1.2',
            '1:1.10',
            '1:2',
            '1:2.0',
            '1:2.1',
            '1:2.2',
            '1:2.10',
        ]

        for name in INTERFACES:
            iface = Interface(device=device, name=name)
            iface.save()

        self.assertListEqual(
            list(Interface.objects.filter(device=device).values_list('name', flat=True)),
            INTERFACES
        )

    def test_interface_ordering_linux(self):
        device = Device.objects.first()
        INTERFACES = [
            'eth0',
            'eth0.1',
            'eth0.2',
            'eth0.10',
            'eth0.100',
            'eth1',
            'eth1.1',
            'eth1.2',
            'eth1.100',
            'lo0',
        ]

        for name in INTERFACES:
            iface = Interface(device=device, name=name)
            iface.save()

        self.assertListEqual(
            list(Interface.objects.filter(device=device).values_list('name', flat=True)),
            INTERFACES
        )

    def test_interface_ordering_junos(self):
        device = Device.objects.first()
        INTERFACES = [
            'xe-0/0/0',
            'xe-0/0/1',
            'xe-0/0/2',
            'xe-0/0/3',
            'xe-0/1/0',
            'xe-0/1/1',
            'xe-0/1/2',
            'xe-0/1/3',
            'xe-1/0/0',
            'xe-1/0/1',
            'xe-1/0/2',
            'xe-1/0/3',
            'xe-1/1/0',
            'xe-1/1/1',
            'xe-1/1/2',
            'xe-1/1/3',
            'xe-2/0/0.1',
            'xe-2/0/0.2',
            'xe-2/0/0.10',
            'xe-2/0/0.11',
            'xe-2/0/0.100',
            'xe-3/0/0:1',
            'xe-3/0/0:2',
            'xe-3/0/0:10',
            'xe-3/0/0:11',
            'xe-3/0/0:100',
            'xe-10/1/0',
            'xe-10/1/1',
            'xe-10/1/2',
            'xe-10/1/3',
            'ae1',
            'ae2',
            'ae10.1',
            'ae10.10',
            'irb.1',
            'irb.2',
            'irb.10',
            'irb.100',
            'lo0',
        ]

        for name in INTERFACES:
            iface = Interface(device=device, name=name)
            iface.save()

        self.assertListEqual(
            list(Interface.objects.filter(device=device).values_list('name', flat=True)),
            INTERFACES
        )

    def test_interface_ordering_ios(self):
        device = Device.objects.first()
        INTERFACES = [
            'GigabitEthernet0/1',
            'GigabitEthernet0/2',
            'GigabitEthernet0/10',
            'TenGigabitEthernet0/20',
            'TenGigabitEthernet0/21',
            'GigabitEthernet1/1',
            'GigabitEthernet1/2',
            'GigabitEthernet1/10',
            'TenGigabitEthernet1/20',
            'TenGigabitEthernet1/21',
            'FastEthernet1',
            'FastEthernet2',
            'FastEthernet10',
        ]

        for name in INTERFACES:
            iface = Interface(device=device, name=name)
            iface.save()

        self.assertListEqual(
            list(Interface.objects.filter(device=device).values_list('name', flat=True)),
            INTERFACES
        )
