1a5f9918aSopenharmony_ci
2a5f9918aSopenharmony_ciimport yaml
3a5f9918aSopenharmony_ciimport pprint
4a5f9918aSopenharmony_ci
5a5f9918aSopenharmony_ci# Tokens mnemonic:
6a5f9918aSopenharmony_ci# directive:            %
7a5f9918aSopenharmony_ci# document_start:       ---
8a5f9918aSopenharmony_ci# document_end:         ...
9a5f9918aSopenharmony_ci# alias:                *
10a5f9918aSopenharmony_ci# anchor:               &
11a5f9918aSopenharmony_ci# tag:                  !
12a5f9918aSopenharmony_ci# scalar                _
13a5f9918aSopenharmony_ci# block_sequence_start: [[
14a5f9918aSopenharmony_ci# block_mapping_start:  {{
15a5f9918aSopenharmony_ci# block_end:            ]}
16a5f9918aSopenharmony_ci# flow_sequence_start:  [
17a5f9918aSopenharmony_ci# flow_sequence_end:    ]
18a5f9918aSopenharmony_ci# flow_mapping_start:   {
19a5f9918aSopenharmony_ci# flow_mapping_end:     }
20a5f9918aSopenharmony_ci# entry:                ,
21a5f9918aSopenharmony_ci# key:                  ?
22a5f9918aSopenharmony_ci# value:                :
23a5f9918aSopenharmony_ci
24a5f9918aSopenharmony_ci_replaces = {
25a5f9918aSopenharmony_ci    yaml.DirectiveToken: '%',
26a5f9918aSopenharmony_ci    yaml.DocumentStartToken: '---',
27a5f9918aSopenharmony_ci    yaml.DocumentEndToken: '...',
28a5f9918aSopenharmony_ci    yaml.AliasToken: '*',
29a5f9918aSopenharmony_ci    yaml.AnchorToken: '&',
30a5f9918aSopenharmony_ci    yaml.TagToken: '!',
31a5f9918aSopenharmony_ci    yaml.ScalarToken: '_',
32a5f9918aSopenharmony_ci    yaml.BlockSequenceStartToken: '[[',
33a5f9918aSopenharmony_ci    yaml.BlockMappingStartToken: '{{',
34a5f9918aSopenharmony_ci    yaml.BlockEndToken: ']}',
35a5f9918aSopenharmony_ci    yaml.FlowSequenceStartToken: '[',
36a5f9918aSopenharmony_ci    yaml.FlowSequenceEndToken: ']',
37a5f9918aSopenharmony_ci    yaml.FlowMappingStartToken: '{',
38a5f9918aSopenharmony_ci    yaml.FlowMappingEndToken: '}',
39a5f9918aSopenharmony_ci    yaml.BlockEntryToken: ',',
40a5f9918aSopenharmony_ci    yaml.FlowEntryToken: ',',
41a5f9918aSopenharmony_ci    yaml.KeyToken: '?',
42a5f9918aSopenharmony_ci    yaml.ValueToken: ':',
43a5f9918aSopenharmony_ci}
44a5f9918aSopenharmony_ci
45a5f9918aSopenharmony_cidef test_tokens(data_filename, tokens_filename, verbose=False):
46a5f9918aSopenharmony_ci    tokens1 = []
47a5f9918aSopenharmony_ci    with open(tokens_filename, 'r') as file:
48a5f9918aSopenharmony_ci        tokens2 = file.read().split()
49a5f9918aSopenharmony_ci    try:
50a5f9918aSopenharmony_ci        with open(data_filename, 'rb') as file:
51a5f9918aSopenharmony_ci            for token in yaml.scan(file):
52a5f9918aSopenharmony_ci                if not isinstance(token, (yaml.StreamStartToken, yaml.StreamEndToken)):
53a5f9918aSopenharmony_ci                    tokens1.append(_replaces[token.__class__])
54a5f9918aSopenharmony_ci    finally:
55a5f9918aSopenharmony_ci        if verbose:
56a5f9918aSopenharmony_ci            print("TOKENS1:", ' '.join(tokens1))
57a5f9918aSopenharmony_ci            print("TOKENS2:", ' '.join(tokens2))
58a5f9918aSopenharmony_ci    assert len(tokens1) == len(tokens2), (tokens1, tokens2)
59a5f9918aSopenharmony_ci    for token1, token2 in zip(tokens1, tokens2):
60a5f9918aSopenharmony_ci        assert token1 == token2, (token1, token2)
61a5f9918aSopenharmony_ci
62a5f9918aSopenharmony_citest_tokens.unittest = ['.data', '.tokens']
63a5f9918aSopenharmony_ci
64a5f9918aSopenharmony_cidef test_scanner(data_filename, canonical_filename, verbose=False):
65a5f9918aSopenharmony_ci    for filename in [data_filename, canonical_filename]:
66a5f9918aSopenharmony_ci        tokens = []
67a5f9918aSopenharmony_ci        try:
68a5f9918aSopenharmony_ci            with open(filename, 'rb') as file:
69a5f9918aSopenharmony_ci                for token in yaml.scan(file):
70a5f9918aSopenharmony_ci                    tokens.append(token.__class__.__name__)
71a5f9918aSopenharmony_ci        finally:
72a5f9918aSopenharmony_ci            if verbose:
73a5f9918aSopenharmony_ci                pprint.pprint(tokens)
74a5f9918aSopenharmony_ci
75a5f9918aSopenharmony_citest_scanner.unittest = ['.data', '.canonical']
76a5f9918aSopenharmony_ci
77a5f9918aSopenharmony_ciif __name__ == '__main__':
78a5f9918aSopenharmony_ci    import test_appliance
79a5f9918aSopenharmony_ci    test_appliance.run(globals())
80a5f9918aSopenharmony_ci
81