Last active
August 13, 2021 13:21
-
-
Save candlerb/7456256993276fb44d1860d9e0927695 to your computer and use it in GitHub Desktop.
Test of natural sorting algorithm
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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