Skip to content

Instantly share code, notes, and snippets.

@candlerb
Last active August 13, 2021 13:21
Show Gist options
  • Save candlerb/7456256993276fb44d1860d9e0927695 to your computer and use it in GitHub Desktop.
Save candlerb/7456256993276fb44d1860d9e0927695 to your computer and use it in GitHub Desktop.
Test of natural sorting algorithm
import re
import unittest
def parse_natural(name):
res = re.split("(\d+)", name)
# first and last element is always a string; alternate values are numbers
for i in range(1, len(res), 2):
res[i] = int(res[i])
return res
#------------------------------------------------------------------------------------
# Derived from https://github.com/netbox-community/netbox/blob/develop/netbox/dcim/tests/test_natural_ordering.py
class NaturalOrderingTestCase(unittest.TestCase):
maxDiff = None
def test_parser(self):
self.assertEqual(parse_natural("Gi1/0/15"), ["Gi",1,"/",0,"/",15,""])
self.assertEqual(parse_natural("1/A20"), ["",1,"/A",20,""])
self.assertEqual(parse_natural("100A"), ["",100,"A"])
def _compare_names(self, names):
sorted_names = sorted(names, key=parse_natural)
self.assertEqual(sorted_names, names)
def test_interface_ordering_numeric(self):
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',
]
self._compare_names(INTERFACES)
def test_interface_ordering_linux(self):
INTERFACES = [
'eth0',
'eth0.1',
'eth0.2',
'eth0.10',
'eth0.100',
'eth1',
'eth1.1',
'eth1.2',
'eth1.100',
'lo0',
]
self._compare_names(INTERFACES)
def test_interface_ordering_junos(self):
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',
]
self._compare_names(INTERFACES)
def test_interface_ordering_ios(self):
INTERFACES = [
'GigabitEthernet0/1',
'GigabitEthernet0/2',
'GigabitEthernet0/10',
'TenGigabitEthernet0/20',
'TenGigabitEthernet0/21',
'GigabitEthernet1/1',
'GigabitEthernet1/2',
'GigabitEthernet1/10',
'TenGigabitEthernet1/20',
'TenGigabitEthernet1/21',
'FastEthernet1',
'FastEthernet2',
'FastEthernet10',
]
self._compare_names(INTERFACES)
if __name__ == '__main__':
unittest.main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment