File: test_fonts3.py

package info (click to toggle)
python-tinycss 0.4-8
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 716 kB
  • sloc: python: 2,476; makefile: 7
file content (144 lines) | stat: -rw-r--r-- 5,949 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# coding: utf-8
"""
    Tests for the Fonts 3 parser
    ----------------------------

    :copyright: (c) 2016 by Kozea.
    :license: BSD, see LICENSE for more details.
"""


from __future__ import unicode_literals

import pytest
from tinycss.fonts3 import CSSFonts3Parser

from . import assert_errors
from .test_tokenizer import jsonify


@pytest.mark.parametrize(('css', 'expected_family_names', 'expected_errors'), [
    ('@font-feature-values foo {}', ('foo',), []),
    ('@font-feature-values Foo Test {}', ('Foo Test',), []),
    ('@font-feature-values \'Foo Test\' {}', ('Foo Test',), []),
    ('@font-feature-values Foo Test, Foo Lol, "Foo tooo"', (
        'Foo Test', 'Foo Lol', 'Foo tooo'), []),
    ('@font-feature-values Foo    , Foo    lol   {}', ('Foo', 'Foo lol'), []),
    ('@font-feature-values Foo , "Foobar" , Lol   {}', (
        'Foo', 'Foobar', 'Lol'), []),
    ('@font-feature-values Foo, {}', None, [
        'invalid @font-feature-values selector']),
    ('@font-feature-values ,Foo {}', None, [
        'invalid @font-feature-values selector']),
    ('@font-feature-values Test,"Foo", {}', None, [
        'invalid @font-feature-values selector']),
    ('@font-feature-values Test "Foo" {}', None, [
        'invalid @font-feature-values selector']),
    ('@font-feature-values Test Foo, Test "bar", "foo" {}', None, [
        'invalid @font-feature-values selector']),
    ('@font-feature-values Test/Foo {}', None, [
        'invalid @font-feature-values selector']),
    ('@font-feature-values /Foo {}', None, [
        'invalid @font-feature-values selector']),
    ('@font-feature-values #Foo {}', None, [
        'invalid @font-feature-values selector']),
    # TODO: this currently works but should not work
    # ('@font-feature-values test@foo {}', None, [
    #     'invalid @font-feature-values selector']),
    ('@font-feature-values Hawaii 5-0 {}', None, [
        'invalid @font-feature-values selector']),
])
def test_font_feature_values_selectors(css, expected_family_names,
                                       expected_errors):
    stylesheet = CSSFonts3Parser().parse_stylesheet(css)
    assert_errors(stylesheet.errors, expected_errors)

    if stylesheet.rules:
        assert len(stylesheet.rules) == 1
        rule = stylesheet.rules[0]
        assert rule.at_keyword == '@font-feature-values'
        assert rule.family_names == expected_family_names


@pytest.mark.parametrize(('css', 'expected_declarations', 'expected_errors'), [
    ('@font-face {}', [], []),
    ('@font-face test { src: "lol"; font-family: "bar" }', None, [
        'unexpected IDENT token in @font-face rule header']),
    ('@font-face { src: "lol"; font-family: "bar" }', [
        ('src', [('STRING', 'lol')]),
        ('font-family', [('STRING', 'bar')])], []),
    ('@font-face { src: "lol"; font-family: "bar"; src: "baz" }', [
        ('src', [('STRING', 'lol')]),
        ('font-family', [('STRING', 'bar')]),
        ('src', [('STRING', 'baz')])], []),
])
def test_font_face_content(css, expected_declarations, expected_errors):
    stylesheet = CSSFonts3Parser().parse_stylesheet(css)
    assert_errors(stylesheet.errors, expected_errors)

    def declarations(rule):
        return [(decl.name, list(jsonify(decl.value)))
                for decl in rule.declarations]

    if expected_declarations is None:
        assert stylesheet.rules == []
        assert expected_errors
    else:
        assert len(stylesheet.rules) == 1
        rule = stylesheet.rules[0]
        assert rule.at_keyword == '@font-face'
        assert declarations(rule) == expected_declarations


@pytest.mark.parametrize(
    ('css', 'expected_rules', 'expected_errors'), [
        ('''@annotation{}''', None, [
            '@annotation rule not allowed in stylesheet']),
        ('''@font-feature-values foo {}''', None, []),
        ('''@font-feature-values foo {
                @swash { ornate: 1; }
                @styleset { double-W: 14; sharp-terminals: 16 1; }
        }''', [
            ('@swash', [('ornate', [('INTEGER', 1)])]),
            ('@styleset', [
                ('double-w', [('INTEGER', 14)]),
                ('sharp-terminals', [
                    ('INTEGER', 16), ('S', ' '), ('INTEGER', 1)])])], []),
        ('''@font-feature-values foo {
                @swash { ornate: 14; }
                @unknown { test: 1; }
        }''', [('@swash', [('ornate', [('INTEGER', 14)])])], [
            'unknown at-rule in @font-feature-values context: @unknown']),
        ('''@font-feature-values foo {
                @annotation{boxed:1}
                bad: 2;
                @brokenstylesetbecauseofbadabove  { sharp: 1}
                @styleset  { sharp-terminals: 16 1; @bad {}}
                @styleset  { @bad {} top-ignored: 3; top: 9000}
                really-bad
        }''', [
            ('@annotation', [('boxed', [('INTEGER', 1)])]),
            ('@styleset', [
                ('sharp-terminals', [
                    ('INTEGER', 16), ('S', ' '), ('INTEGER', 1)])]),
            ('@styleset', [('top', [('INTEGER', 9000)])])], [
                'unexpected ; token in selector',
                'expected a property name, got ATKEYWORD',
                'expected a property name, got ATKEYWORD',
                'no declaration block found for ruleset']),
    ])
def test_font_feature_values_content(css, expected_rules, expected_errors):
    stylesheet = CSSFonts3Parser().parse_stylesheet(css)
    assert_errors(stylesheet.errors, expected_errors)

    if expected_rules is not None:
        assert len(stylesheet.rules) == 1
        rule = stylesheet.rules[0]
        assert rule.at_keyword == '@font-feature-values'

        rules = [
            (at_rule.at_keyword, [
                (decl.name, list(jsonify(decl.value)))
                for decl in at_rule.declarations])
            for at_rule in rule.at_rules] if rule.at_rules else None
        assert rules == expected_rules