| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- from unittest import TestCase
- from parse import split_selectors, parse_groups
- class TestHelpers(TestCase):
- def test_split_selectors(self):
- self.assertEqual(split_selectors(''), [])
- self.assertEqual(split_selectors('a, b'), ['a', 'b'])
- self.assertEqual(split_selectors('a ,b'), ['a', 'b'])
- self.assertEqual(split_selectors('\na ,b '), ['a', 'b'])
- self.assertEqual(split_selectors('a, b\nc'), ['a', 'b c'])
- self.assertEqual(split_selectors('a,\nb c ,d\n'), ['a', 'b c', 'd'])
- class TestParseGroups(TestCase):
- def test_empty_stylesheet(self):
- self.assertParse('', [])
- self.assertParse(' \n ', [])
- def test_empty_block(self):
- self.assertParse('div {}', [(None, [(['div'], [])])])
- def test_single_property(self):
- self.assertParse('div {color:black;}',
- [(None, [(['div'], [('color', 'black')])])])
- self.assertParse('div {color:black}',
- [(None, [(['div'], [('color', 'black')])])])
- self.assertParse('''
- div {
- color: black;
- }
- ''', [(None, [(['div'], [('color', 'black')])])])
- self.assertParse('''
- div {
- color: black
- }
- ''', [(None, [(['div'], [('color', 'black')])])])
- def test_multiple_properties(self):
- self.assertParse('''
- div {
- color: black;
- border: none;
- }
- ''', [(None, [(['div'], [('color', 'black'), ('border', 'none')])])])
- self.assertParse('''
- div {
- color: black;
- border: none
- }
- ''', [(None, [(['div'], [('color', 'black'), ('border', 'none')])])])
- def test_multiple_selectors(self):
- self.assertParse('div,p {color: black}',
- [(None, [(['div', 'p'], [('color', 'black')])])])
- self.assertParse('div, p {color: black}',
- [(None, [(['div', 'p'], [('color', 'black')])])])
- self.assertParse('p,\n\tdiv {color: black}',
- [(None, [(['p', 'div'], [('color', 'black')])])])
- def test_single_group(self):
- self.assertParse('''
- @media (min-width: 970px) {
- div {color: black}
- }
- ''', [(['@media (min-width: 970px)'],
- [(['div'], [('color', 'black')])])])
- def test_single_group_multiple_blocks(self):
- self.assertParse('''
- @media (min-width: 970px) {
- div {color: black}
- p {margin: 0}
- }
- ''', [(['@media (min-width: 970px)'],
- [(['div'], [('color', 'black')]), (['p'], [('margin', '0')])])])
- def test_multiple_groups(self):
- self.assertParse('''
- @media (min-width: 970px) {
- div {color: black}
- }
- @media (max-width: 969px) {
- div {color: red}
- }
- ''', [
- (['@media (min-width: 970px)'], [(['div'], [('color', 'black')])]),
- (['@media (max-width: 969px)'], [(['div'], [('color', 'red')])])
- ])
- def test_group_with_root(self):
- self.assertParse('''
- div {
- color: black
- }
- @media (max-width: 969px) {
- div {color: red}
- }
- ''', [
- (None, [(['div'], [('color', 'black')])]),
- (['@media (max-width: 969px)'], [(['div'], [('color', 'red')])])
- ])
- self.assertParse('''
- @media (max-width: 969px) {
- div {color: red}
- }
- div {
- color: black
- }
- ''', [
- (['@media (max-width: 969px)'], [(['div'], [('color', 'red')])]),
- (None, [(['div'], [('color', 'black')])])
- ])
- def test_group_with_multiple_roots(self):
- self.assertParse('''
- div {
- color: black
- }
- @media (max-width: 969px) {
- div {color: red}
- }
- p {
- margin: 0
- }
- ''', [
- (None, [(['div'], [('color', 'black')])]),
- (['@media (max-width: 969px)'], [(['div'], [('color', 'red')])]),
- (None, [(['p'], [('margin', '0')])])
- ])
- def test_multiple_groups_multiple_roots(self):
- self.assertParse('''
- @media (min-width: 970px) {
- div {color: black}
- }
- div {
- color: black
- }
- @media (max-width: 969px) {
- div {color: red}
- }
- p {
- margin: 0
- }
- ''', [
- (['@media (min-width: 970px)'], [(['div'], [('color', 'black')])]),
- (None, [(['div'], [('color', 'black')])]),
- (['@media (max-width: 969px)'], [(['div'], [('color', 'red')])]),
- (None, [(['p'], [('margin', '0')])])
- ])
- self.assertParse('''
- p {
- margin: 0
- }
- @media (min-width: 970px) {
- div {color: black}
- }
- div {
- color: black
- }
- @media (max-width: 969px) {
- div {color: red}
- }
- ''', [
- (None, [(['p'], [('margin', '0')])]),
- (['@media (min-width: 970px)'], [(['div'], [('color', 'black')])]),
- (None, [(['div'], [('color', 'black')])]),
- (['@media (max-width: 969px)'], [(['div'], [('color', 'red')])]),
- ])
- def test_comment(self):
- self.assertParse('''
- /* this is a comment */
- div {color: black}
- ''', [(None, [(['div'], [('color', 'black')])])])
- self.assertParse('''
- /*
- * this is a multiline comment
- */
- div {color: black}
- ''', [(None, [(['div'], [('color', 'black')])])])
- self.assertParse('''
- div {color: /*inline comment*/ black}
- ''', [(None, [(['div'], [('color', 'black')])])])
- def test_error_brackets(self):
- self.assertRaisesRegexp(Exception, 'unexpected \'{\' on line 1',
- parse_groups, '{')
- self.assertRaisesRegexp(Exception, 'unexpected \'{\' on line 2',
- parse_groups, 'div {\n{}')
- self.assertRaisesRegexp(Exception, 'unexpected \'}\' on line 1',
- parse_groups, '}')
- self.assertRaisesRegexp(Exception, 'unexpected \'}\' on line 2',
- parse_groups, 'div\n}')
- def test_error_EOF(self):
- self.assertRaisesRegexp(Exception, 'unexpected <EOF> on line 3',
- parse_groups, '\ndiv\n')
- self.assertRaisesRegexp(Exception, 'unexpected <EOF> on line 2',
- parse_groups, '\ndiv {')
- def test_error_property_name(self):
- self.assertRaisesRegexp(Exception, 'unexpected \':\' on line 2',
- parse_groups, 'div{margin\nleft: 0}')
- def test_error_property_value(self):
- self.assertRaisesRegexp(Exception, 'unexpected \';\' on line 1',
- parse_groups, 'div{margin:;}')
- self.assertRaisesRegexp(Exception, 'unexpected \';\' on line 1',
- parse_groups, 'div{foo;}')
- self.assertParse('div {;}', [(None, [(['div'], [])])])
- def assertParse(self, css, result):
- self.assertEqual(parse_groups(css), result)
|