Esempio n. 1
0
    def test_intrinsic_width(self):
        node = TestNode(name='img', style=CSS(display=INLINE))
        node.intrinsic.width = 50
        node.intrinsic.is_replaced = True

        self.layout_node(node)

        self.assertLayout(
            node, {
                'tag': 'img',
                'border_box': {
                    'position': (0, 0),
                    'size': (50, 25)
                },
                'padding_box': {
                    'position': (0, 0),
                    'size': (50, 25)
                },
                'content': {
                    'position': (0, 0),
                    'size': (50, 25)
                },
            })
    def test_auto_top_margin(self):
        node = TestNode(name='img', style=CSS(display=INLINE, margin_top=AUTO))
        node.intrinsic.width = 50
        node.intrinsic.height = 10
        node.intrinsic.is_replaced = True

        self.layout_node(node)

        self.assertLayout(
            node, {
                'tag': 'img',
                'border_box': {
                    'position': (0, 0),
                    'size': (50, 10)
                },
                'padding_box': {
                    'position': (0, 0),
                    'size': (50, 10)
                },
                'content': {
                    'position': (0, 0),
                    'size': (50, 10)
                },
            })
    def test_intrinsic_height_and_ratio(self):
        node = TestNode(name='img', style=CSS(display=INLINE))
        node.intrinsic.height = 10
        node.intrinsic.ratio = 3.0
        node.intrinsic.is_replaced = True

        self.layout_node(node)

        self.assertLayout(
            node, {
                'tag': 'img',
                'border_box': {
                    'position': (0, 0),
                    'size': (30, 10)
                },
                'padding_box': {
                    'position': (0, 0),
                    'size': (30, 10)
                },
                'content': {
                    'position': (0, 0),
                    'size': (30, 10)
                },
            })
Esempio n. 4
0
    def test_border_shorthands_valid_property_tuple_sets_shorthand_subproperties(
            self):
        for direction in ['bottom', 'left', 'right', 'top']:
            node = TestNode(style=CSS())
            node.layout.dirty = None

            setattr(node.style, 'border_' + direction,
                    ('solid', 'thick', 'black'))

            self.assertEqual(
                str(
                    getattr(
                        node.style, 'border_{direction}_color'.format(
                            direction=direction))), 'rgba(0, 0, 0, 1.0)')
            self.assertEqual(
                str(
                    getattr(
                        node.style, 'border_{direction}_style'.format(
                            direction=direction))), 'solid')
            self.assertEqual(
                str(
                    getattr(
                        node.style, 'border_{direction}_width'.format(
                            direction=direction))), 'thick')
Esempio n. 5
0
    def test_None_default_property(self):
        node = TestNode(style=CSS())
        node.layout.dirty = None

        # Default value is None
        self.assertIsNone(node.style.max_width)
        self.assertIsNone(node.style.dirty)

        # Modify the value
        node.style.max_width = 10

        self.assertEqual(node.style.max_width, 10)
        self.assertTrue(node.style.dirty)

        # Clean the layout
        node.layout.dirty = False

        # Set the value to the same value.
        # Dirty flag is not set.
        node.style.max_width = 10
        self.assertEqual(node.style.max_width, 10)
        self.assertFalse(node.style.dirty)

        # Set the value to something new
        # Dirty flag is set.
        node.style.max_width = 20
        self.assertEqual(node.style.max_width, 20)
        self.assertTrue(node.style.dirty)

        # Clean the layout
        node.layout.dirty = False

        # Clear the property
        del node.style.max_width
        self.assertIsNone(node.style.max_width)
        self.assertTrue(node.style.dirty)
Esempio n. 6
0
    def test_shorthand_valid_outline_property_resets(self):
        node = TestNode(style=CSS())
        node.layout.dirty = None

        node.style.outline_color = "black"
        node.style.outline_style = "solid"
        node.style.outline_width = "thick"

        self.assertEqual(str(node.style.outline),
                         'rgba(0, 0, 0, 1.0) solid thick')
        self.assertEqual(
            str(node.style),
            "outline-color: rgba(0, 0, 0, 1.0); outline-style: solid; outline-width: thick"
        )

        # This should reset all other properties to their initial values
        node.style.outline = "black"

        self.assertEqual(str(node.style.outline_color), "rgba(0, 0, 0, 1.0)")
        self.assertEqual(node.style.outline_style, None)
        self.assertEqual(node.style.outline_width, "medium")

        self.assertEqual(str(node.style.outline), 'rgba(0, 0, 0, 1.0)')
        self.assertEqual(str(node.style), "outline-color: rgba(0, 0, 0, 1.0)")
Esempio n. 7
0
    def test_property_border_spacing_valid_sequence_2_items(self):
        node = TestNode(style=CSS())
        node.layout.dirty = None

        # List of strings
        node.style.border_spacing = ['1', '2']
        self.assertEqual(node.style.border_spacing.horizontal, 1 * px)
        self.assertEqual(node.style.border_spacing.vertical, 2 * px)
        self.assertEqual(repr(node.style.border_spacing), 'BorderSpacing(1px, 2px)')
        self.assertEqual(str(node.style.border_spacing), '1px 2px')

        # List
        node.style.border_spacing = [1, 2]
        self.assertEqual(node.style.border_spacing.horizontal, 1 * px)
        self.assertEqual(node.style.border_spacing.vertical, 2 * px)
        self.assertEqual(repr(node.style.border_spacing), 'BorderSpacing(1px, 2px)')
        self.assertEqual(str(node.style.border_spacing), '1px 2px')

        # Tuple
        node.style.border_spacing = (1, 2)
        self.assertEqual(node.style.border_spacing.horizontal, 1 * px)
        self.assertEqual(node.style.border_spacing.vertical, 2 * px)
        self.assertEqual(repr(node.style.border_spacing), 'BorderSpacing(1px, 2px)')
        self.assertEqual(str(node.style.border_spacing), '1px 2px')
Esempio n. 8
0
    def test_simple_vertical(self):
        child1 = TestNode(
            name='div',
            style=CSS(display=BLOCK, height=10),
        )
        child2 = TestNode(
            name='div',
            style=CSS(display=BLOCK, height=10),
        )
        child3 = TestNode(
            name='div',
            style=CSS(display=BLOCK, height=10),
        )

        root = TestNode(name='div',
                        style=CSS(display=BLOCK),
                        children=[child1, child2, child3])

        layout(self.display, root)

        self.assertLayout(
            root, {
                'tag':
                'div',
                'border_box': {
                    'position': (0, 0),
                    'size': (1024, 768)
                },
                'padding_box': {
                    'position': (0, 0),
                    'size': (1024, 768)
                },
                'content': {
                    'position': (0, 0),
                    'size': (1024, 768)
                },
                'children': [{
                    'tag': 'div',
                    'border_box': {
                        'position': (0, 0),
                        'size': (1024, 10)
                    },
                    'padding_box': {
                        'position': (0, 0),
                        'size': (1024, 10)
                    },
                    'content': {
                        'position': (0, 0),
                        'size': (1024, 10)
                    },
                }, {
                    'tag': 'div',
                    'border_box': {
                        'position': (0, 10),
                        'size': (1024, 10)
                    },
                    'padding_box': {
                        'position': (0, 10),
                        'size': (1024, 10)
                    },
                    'content': {
                        'position': (0, 10),
                        'size': (1024, 10)
                    },
                }, {
                    'tag': 'div',
                    'border_box': {
                        'position': (0, 20),
                        'size': (1024, 10)
                    },
                    'padding_box': {
                        'position': (0, 20),
                        'size': (1024, 10)
                    },
                    'content': {
                        'position': (0, 20),
                        'size': (1024, 10)
                    },
                }],
            })
Esempio n. 9
0
    def test_quotes_valid_list_1_pair(self):
        node = TestNode(style=CSS())
        node.layout.dirty = None

        node.style.quotes = [('<', '>')]
        self.assertEqual(node.style.quotes, Quotes([('<', '>')]))
Esempio n. 10
0
    def test_quotes_valid_sequence_4_items(self):
        node = TestNode(style=CSS())
        node.layout.dirty = None

        node.style.quotes = '<', '>', '{', '}'
        self.assertEqual(node.style.quotes, Quotes([('<', '>'), ('{', '}')]))
Esempio n. 11
0
    def test_quotes_valid_str_2_items(self):
        node = TestNode(style=CSS())
        node.layout.dirty = None

        node.style.quotes = "'<' '>'"
        self.assertEqual(node.style.quotes, Quotes([('<', '>')]))
Esempio n. 12
0
    def test_validated_property_cursor_default_value(self):
        node = TestNode(style=CSS())
        node.layout.dirty = None

        self.assertEqual(str(node.style.cursor), AUTO)
Esempio n. 13
0
    def test_directional_property(self):
        node = TestNode(style=CSS())
        node.layout.dirty = None

        # Default value is 0
        self.assertEqual(node.style.margin, (0, 0, 0, 0))
        self.assertEqual(node.style.margin_top, 0)
        self.assertEqual(node.style.margin_right, 0)
        self.assertEqual(node.style.margin_bottom, 0)
        self.assertEqual(node.style.margin_left, 0)
        self.assertIsNone(node.style.dirty)

        # Set a value in one axis
        node.style.margin_top = 10

        self.assertEqual(node.style.margin, (10, 0, 0, 0))
        self.assertEqual(node.style.margin_top, 10)
        self.assertEqual(node.style.margin_right, 0)
        self.assertEqual(node.style.margin_bottom, 0)
        self.assertEqual(node.style.margin_left, 0)
        self.assertTrue(node.style.dirty)

        # Clean the layout
        node.layout.dirty = False

        # Set a value directly with a single item
        node.style.margin = (10, )

        self.assertEqual(node.style.margin, (10, 10, 10, 10))
        self.assertEqual(node.style.margin_top, 10)
        self.assertEqual(node.style.margin_right, 10)
        self.assertEqual(node.style.margin_bottom, 10)
        self.assertEqual(node.style.margin_left, 10)
        self.assertTrue(node.style.dirty)

        # Clean the layout
        node.layout.dirty = False

        # Set a value directly with a single item
        node.style.margin = 30

        self.assertEqual(node.style.margin, (30, 30, 30, 30))
        self.assertEqual(node.style.margin_top, 30)
        self.assertEqual(node.style.margin_right, 30)
        self.assertEqual(node.style.margin_bottom, 30)
        self.assertEqual(node.style.margin_left, 30)
        self.assertTrue(node.style.dirty)

        # Clean the layout
        node.layout.dirty = False

        # Set a value directly with a 2 values
        node.style.margin = (10, 20)

        self.assertEqual(node.style.margin, (10, 20, 10, 20))
        self.assertEqual(node.style.margin_top, 10)
        self.assertEqual(node.style.margin_right, 20)
        self.assertEqual(node.style.margin_bottom, 10)
        self.assertEqual(node.style.margin_left, 20)
        self.assertTrue(node.style.dirty)

        # Clean the layout
        node.layout.dirty = False

        # Set a value directly with a 3 values
        node.style.margin = (10, 20, 30)

        self.assertEqual(node.style.margin, (10, 20, 30, 20))
        self.assertEqual(node.style.margin_top, 10)
        self.assertEqual(node.style.margin_right, 20)
        self.assertEqual(node.style.margin_bottom, 30)
        self.assertEqual(node.style.margin_left, 20)
        self.assertTrue(node.style.dirty)

        # Clean the layout
        node.layout.dirty = False

        # Set a value directly with a 4 values
        node.style.margin = (10, 20, 30, 40)

        self.assertEqual(node.style.margin, (10, 20, 30, 40))
        self.assertEqual(node.style.margin_top, 10)
        self.assertEqual(node.style.margin_right, 20)
        self.assertEqual(node.style.margin_bottom, 30)
        self.assertEqual(node.style.margin_left, 40)
        self.assertTrue(node.style.dirty)

        # Set a value directly with an invalid number of values
        with self.assertRaises(ValueError):
            node.style.margin = ()

        with self.assertRaises(ValueError):
            node.style.margin = (10, 20, 30, 40, 50)

        # Clean the layout
        node.layout.dirty = False

        # Clear a value on one axis
        del node.style.margin_top

        self.assertEqual(node.style.margin, (0, 20, 30, 40))
        self.assertEqual(node.style.margin_top, 0)
        self.assertEqual(node.style.margin_right, 20)
        self.assertEqual(node.style.margin_bottom, 30)
        self.assertEqual(node.style.margin_left, 40)
        self.assertTrue(node.style.dirty)

        # Restore the top margin
        node.style.margin_top = 10

        # Clean the layout
        node.layout.dirty = False

        # Clear a value directly
        del node.style.margin

        self.assertEqual(node.style.margin, (0, 0, 0, 0))
        self.assertEqual(node.style.margin_top, 0)
        self.assertEqual(node.style.margin_right, 0)
        self.assertEqual(node.style.margin_bottom, 0)
        self.assertEqual(node.style.margin_left, 0)
        self.assertTrue(node.style.dirty)
Esempio n. 14
0
 def layout_node(self, node):
     root = TestNode(style=CSS(display=BLOCK), children=[node])
     layout(self.display, root)
Esempio n. 15
0
    def test_overflow_outside_parent(self):
        grandchild1 = TestNode(
            name='div',
            style=CSS(display=BLOCK, height=10, margin=50),
        )
        grandchild2 = TestNode(
            name='div',
            style=CSS(display=BLOCK, height=10, margin=40),
        )

        child = TestNode(name='div',
                         style=CSS(display=BLOCK, height=10, margin=10),
                         children=[grandchild1, grandchild2])

        root = TestNode(name='div', style=CSS(display=BLOCK), children=[child])

        layout(self.display, root)

        self.assertLayout(
            root, {
                'tag':
                'div',
                'border_box': {
                    'size': (1024, 708),
                    'position': (0, 50)
                },
                'padding_box': {
                    'size': (1024, 708),
                    'position': (0, 50)
                },
                'content': {
                    'size': (1024, 708),
                    'position': (0, 50)
                },
                'children': [{
                    'tag':
                    'div',
                    'border_box': {
                        'size': (1004, 10),
                        'position': (10, 50)
                    },
                    'padding_box': {
                        'size': (1004, 10),
                        'position': (10, 50)
                    },
                    'content': {
                        'size': (1004, 10),
                        'position': (10, 50)
                    },
                    'children': [{
                        'tag': 'div',
                        'border_box': {
                            'size': (904, 10),
                            'position': (60, 50)
                        },
                        'padding_box': {
                            'size': (904, 10),
                            'position': (60, 50)
                        },
                        'content': {
                            'size': (904, 10),
                            'position': (60, 50)
                        },
                    }, {
                        'tag': 'div',
                        'border_box': {
                            'size': (924, 10),
                            'position': (50, 110)
                        },
                        'padding_box': {
                            'size': (924, 10),
                            'position': (50, 110)
                        },
                        'content': {
                            'size': (924, 10),
                            'position': (50, 110)
                        },
                    }],
                }],
            })
Esempio n. 16
0
    def test_shorthand_valid_outline_property_initial_values(self):
        node = TestNode(style=CSS())
        node.layout.dirty = None

        self.assertEqual(str(node.style.outline), '')
Esempio n. 17
0
    def test_quotes_valid_str(self):
        node = TestNode(style=CSS())
        node.layout.dirty = None

        node.style.quotes = [('<', '>'), ('{', '}')]
        self.assertEqual(str(node.style), "quotes: '<' '>' '{' '}'")
Esempio n. 18
0
    def test_border_shorthands_valid_initial_values(self):
        node = TestNode(style=CSS())
        node.layout.dirty = None

        for property_name in ['border', 'border_bottom', 'border_left', 'border_right', 'border_top']:
            self.assertEqual(str(getattr(node.style, property_name)), '')
Esempio n. 19
0
    def test_collapsed_margins(self):
        child1 = TestNode(
            name='div',
            style=CSS(display=BLOCK, height=10, margin=10),
        )
        child2 = TestNode(
            name='div',
            style=CSS(display=BLOCK, height=10, margin=30),
        )
        child3 = TestNode(
            name='div',
            style=CSS(display=BLOCK, height=10, margin=20),
        )

        root = TestNode(name='div',
                        style=CSS(display=BLOCK),
                        children=[child1, child2, child3])

        layout(self.display, root)

        self.assertLayout(
            root, {
                'tag':
                'div',
                'border_box': {
                    'position': (0, 10),
                    'size': (1024, 738)
                },
                'padding_box': {
                    'position': (0, 10),
                    'size': (1024, 738)
                },
                'content': {
                    'position': (0, 10),
                    'size': (1024, 738)
                },
                'children': [{
                    'tag': 'div',
                    'border_box': {
                        'position': (10, 10),
                        'size': (1004, 10)
                    },
                    'padding_box': {
                        'position': (10, 10),
                        'size': (1004, 10)
                    },
                    'content': {
                        'position': (10, 10),
                        'size': (1004, 10)
                    },
                }, {
                    'tag': 'div',
                    'border_box': {
                        'position': (30, 50),
                        'size': (964, 10)
                    },
                    'padding_box': {
                        'position': (30, 50),
                        'size': (964, 10)
                    },
                    'content': {
                        'position': (30, 50),
                        'size': (964, 10)
                    },
                }, {
                    'tag': 'div',
                    'border_box': {
                        'position': (20, 90),
                        'size': (984, 10)
                    },
                    'padding_box': {
                        'position': (20, 90),
                        'size': (984, 10)
                    },
                    'content': {
                        'position': (20, 90),
                        'size': (984, 10)
                    },
                }],
            })
Esempio n. 20
0
 def test_engine(self):
     node = TestNode(style=CSS())
     self.assertEqual(node.style.engine(), css_engine)