def test_infer(): assert Alignment.infer('test', 'test') == Alignment.identity(4) assert Alignment.infer('asdf', 'jkl;') == Alignment.identity(4) assert Alignment.infer('color', 'colour') == Alignment([ (0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (4, 5), (5, 6), ]) assert Alignment.infer('color', 'colour') == Alignment.infer('colour', 'color').inverse() assert Alignment.infer("ab---", "ab") == Alignment([ (0, 0), (1, 1), (2, 2), (3, 2), (4, 2), (5, 2), ])
def test_append(): builder = BistrBuilder('hello WORLD') builder.append(bistr(builder.peek(5)).upper('en_US')) builder.skip(1) builder.append(bistr(builder.peek(5)).lower('en_US')) bs = builder.build() assert bs[1:4] == bistr('ell', 'ELL', Alignment.identity(3)) assert bs[7:10] == bistr('ORL', 'orl', Alignment.identity(3))
def test_canonicalization(): assert Alignment([(0, 0), (1, 2), (1, 2), (2, 4)]) == Alignment([(0, 0), (1, 2), (2, 4)]) assert Alignment([(0, 0), (1, 2)]) + Alignment([(1, 2), (2, 4)]) == Alignment([(0, 0), (1, 2), (2, 4)])
def test_identity(): alignment = Alignment.identity(1, 16) assert alignment == Alignment((i, i) for i in range(1, 17)) assert list(alignment) == [(i, i) for i in range(1, 17)] assert alignment.original_bounds() == (1, 16) assert alignment.modified_bounds() == (1, 16) assert alignment.original_bounds(4, 7) == (4, 7) assert alignment.modified_bounds(4, 7) == (4, 7)
def test_compose_identity(): alignment = Alignment([ (0, 2), (2, 2), (4, 4), (6, 6), (8, 6), ]) # Modified sequence is smaller _test_identity_composition(alignment) # Original sequence is smaller _test_identity_composition(alignment.inverse())
def test_capitalize(): bs = bistr('hello WORLD').capitalize('en_US') assert bs.original == 'hello WORLD' assert bs.modified == 'Hello world' assert bs.alignment == Alignment.identity(11) bs = bistr('τελικός').capitalize('el_GR') assert bs.original == 'τελικός' assert bs.modified == 'Τελικός' assert bs.alignment == Alignment.identity(7) bs = bistr('ἴΣ').capitalize('el_GR') assert bs.original == 'ἴΣ' assert bs.modified == 'Ἴς' assert bs.alignment == Alignment.identity(2)
def test_swapcase(): bs = bistr('hello WORLD').swapcase('en_US') assert bs.original == 'hello WORLD' assert bs.modified == 'HELLO world' assert bs.alignment == Alignment.identity(11) # Ligatures/digraphs in title case don't have a swapped form bs = bistr('Ljepòta').swapcase('hr_HR') assert bs.original == 'Ljepòta' assert bs.modified == 'LjEPÒTA' assert bs.alignment == Alignment.identity(6) bs = bistr('Ljepòta').normalize('NFKC').swapcase('hr_HR') assert bs.original == 'Ljepòta' assert bs.modified == 'lJEPÒTA' assert bs[0:2] == bistr('Lj', 'lJ')
def test_infer(): bs = bistr.infer('test', 'test') assert bs == bistr('test', 'test', Alignment.identity(4)) bs = bistr.infer('color', 'colour') assert bs[3:5].original == 'o' assert bs.inverse() == bistr.infer('colour', 'color')
def test_infer(): bs = bistr.infer('test', 'test') assert bs == bistr('test', 'test', Alignment.identity(4)) bs = bistr.infer('color', 'colour') assert bs[3:5].original == 'o' assert bs.inverse() == bistr.infer('colour', 'color') bs = bistr.infer("--Hello, world!--", "hello world") assert bs[:5] == bistr("Hello", "hello", Alignment.identity(5)) assert bs[6:] == bistr("world") bs = bistr.infer( '🅃🄷🄴 🅀🅄🄸🄲🄺, 🄱🅁🄾🅆🄽 🦊 🄹🅄🄼🄿🅂 🄾🅅🄴🅁 🅃🄷🄴 🄻🄰🅉🅈 🐶', 'the quick brown fox jumps over the lazy dog', ) assert bs[0:3] == bistr('🅃🄷🄴', 'the', Alignment.identity(3)) assert bs[4:9] == bistr('🅀🅄🄸🄲🄺', 'quick', Alignment.identity(5)) assert bs[10:15] == bistr('🄱🅁🄾🅆🄽', 'brown', Alignment.identity(5)) assert bs[16:19].original == '🦊' assert bs[16:19].modified == 'fox' assert bs[20:25] == bistr('🄹🅄🄼🄿🅂', 'jumps', Alignment.identity(5)) assert bs[40:43].original == '🐶' assert bs[40:43].modified == 'dog' bs = bistr.infer( 'Ṫḧë qüïċḳ, ḅṛöẅṅ 🦊 jüṁṗṡ öṿëṛ ẗḧë ḷäżÿ 🐶', 'the quick brown fox jumps over the lazy dog', ) assert bs[0:3] == bistr('Ṫḧë', 'the', Alignment.identity(3)) assert bs[4:9] == bistr('qüïċḳ', 'quick', Alignment.identity(5)) assert bs[10:15] == bistr('ḅṛöẅṅ', 'brown', Alignment.identity(5)) assert bs[16:19].original == '🦊' assert bs[16:19].modified == 'fox' assert bs[20:25] == bistr('jüṁṗṡ', 'jumps', Alignment.identity(5)) assert bs[40:43].original == '🐶' assert bs[40:43].modified == 'dog' bs = bistr.infer( 'Z̴̡̪̫̖̥̔̿̃̈̏̎͠͝á̸̪̠̖̻̬̖̪̞͙͇̮̠͎̆͋́̐͌̒͆̓l̶͉̭̳̤̬̮̩͎̟̯̜͇̥̠̘͑͐̌͂̄́̀̂̌̈͛̊̄̚͜ģ̸̬̼̞̙͇͕͎̌̾̒̐̿̎̆̿̌̃̏̌́̾̈͘͜o̶̢̭͕͔̩͐ ̴̡̡̜̥̗͔̘̦͉̣̲͚͙̐̈́t̵͈̰̉̀͒̎̈̿̔̄̽͑͝͠ẹ̵̫̲̫̄͜͜x̵͕̳͈̝̤̭̼̼̻͓̿̌̽̂̆̀̀̍̒͐́̈̀̚͝t̸̡̨̥̺̣̟͎̝̬̘̪͔͆́̄̅̚', 'Zalgo text') for i, c in enumerate(bs): assert bs[i:i + 1].original.startswith(c)
def test_empty(): pytest.raises(ValueError, Alignment, []) alignment = Alignment.identity(0) assert list(alignment) == [(0, 0)] assert alignment.original_bounds() == (0, 0) assert alignment.modified_bounds() == (0, 0) assert alignment.original_bounds(0, 0) == (0, 0) assert alignment.modified_bounds(0, 0) == (0, 0)
def test_new(): pytest.raises(TypeError, bistr, 42) pytest.raises(TypeError, bistr, 'fourty-two', 42) pytest.raises(TypeError, bistr, 'fourty-two', '42', 42) pytest.raises(ValueError, bistr, 'fourty-two', '42', Alignment([ (0, 0), (9, 2), ])) pytest.raises(ValueError, bistr, 'fourty-two', '42', Alignment([ (0, 0), (10, 1), ])) bistr('42') bistr('fourty-two', '42') bistr('fourty-two', '42', Alignment([ (0, 0), (6, 1), (7, 1), (10, 2), ]))
def test_indexing(): data = [ (0, 1), (1, 2), (2, 4), (3, 8), (4, 16), ] length = len(data) alignment = Alignment(data) assert len(alignment) == length for i in range(length): assert alignment[i] == data[i] assert alignment[i - length] == data[i - length] for j in range(i + 1, length + 1): assert list(alignment[i:j]) == data[i:j]
def test_equality(): bs1 = bistr(' Hello world ').strip().casefold() bs2 = bistr(' Hello world ', 'hello world', Alignment([ (0, 0), (2, 0), (3, 1), (4, 2), (5, 3), (6, 4), (7, 5), (8, 6), (9, 7), (10, 8), (11, 9), (12, 10), (13, 11), (15, 11), ])) assert bs1 == bs2
def _test_identity_composition(alignment): _test_composition(alignment, Alignment.identity(alignment.modified_range())) _test_composition(Alignment.identity(alignment.original_range()), alignment)
def test_compose(): first = Alignment((i, 2 * i) for i in range(4)) second = Alignment((i, 2 * i) for i in range(7)) _test_composition(first, second)
def test_aligning(): alignment = Alignment([(0, 0), (1, 2), (2, 4), (3, 6)]) assert alignment.original_bounds() == (0, 3) assert alignment.modified_bounds() == (0, 6) assert alignment.original_bounds(0, 0) == (0, 0) assert alignment.original_bounds(0, 1) == (0, 1) assert alignment.original_bounds(0, 2) == (0, 1) assert alignment.original_bounds(0, 3) == (0, 2) assert alignment.original_bounds(1, 1) == (0, 1) assert alignment.original_bounds(1, 3) == (0, 2) assert alignment.original_bounds(1, 4) == (0, 2) assert alignment.original_bounds(2, 2) == (1, 1) assert alignment.original_bounds(2, 4) == (1, 2) assert alignment.original_bounds(2, 5) == (1, 3) assert alignment.original_bounds(3, 3) == (1, 2) assert alignment.modified_bounds(0, 0) == (0, 0) assert alignment.modified_bounds(0, 1) == (0, 2) assert alignment.modified_bounds(0, 2) == (0, 4) assert alignment.modified_bounds(0, 3) == (0, 6) assert alignment.modified_bounds(1, 1) == (2, 2) assert alignment.modified_bounds(2, 2) == (4, 4)