Blame 11.patch

6d2a5b2
From b1136b5c52b4ad548bdd338654ee6ae1370e1f0d Mon Sep 17 00:00:00 2001
6d2a5b2
From: Hugo van Kemenade <hugovk@users.noreply.github.com>
6d2a5b2
Date: Fri, 31 Dec 2021 00:41:28 +0200
6d2a5b2
Subject: [PATCH 1/2] Replace removed assertEquals with assertEqual
6d2a5b2
6d2a5b2
---
6d2a5b2
 css_parser_tests/basetest.py  |  2 +-
6d2a5b2
 css_parser_tests/test_util.py | 32 ++++++++++++++++----------------
6d2a5b2
 2 files changed, 17 insertions(+), 17 deletions(-)
6d2a5b2
6d2a5b2
diff --git a/css_parser_tests/basetest.py b/css_parser_tests/basetest.py
6d2a5b2
index 115053f..f45a620 100644
6d2a5b2
--- a/css_parser_tests/basetest.py
6d2a5b2
+++ b/css_parser_tests/basetest.py
6d2a5b2
@@ -261,7 +261,7 @@ class GenerateTests(type):
6d2a5b2
     Example::
6d2a5b2
 
6d2a5b2
         def gen_test_length(self, string, expected):
6d2a5b2
-            self.assertEquals(len(string), expected)
6d2a5b2
+            self.assertEqual(len(string), expected)
6d2a5b2
         gen_test_length.cases = [
6d2a5b2
             ("a", 1),
6d2a5b2
             ("aa", 2),
6d2a5b2
diff --git a/css_parser_tests/test_util.py b/css_parser_tests/test_util.py
6d2a5b2
index 9ccd151..7ab1388 100644
6d2a5b2
--- a/css_parser_tests/test_util.py
6d2a5b2
+++ b/css_parser_tests/test_util.py
6d2a5b2
@@ -442,12 +442,12 @@ def test_ensure(self):
6d2a5b2
     def test_calling(self):
6d2a5b2
         self.assertIsNone(self.lazyre('bar'))
6d2a5b2
         match = self.lazyre('foobar')
6d2a5b2
-        self.assertEquals(match.group(), 'foo')
6d2a5b2
+        self.assertEqual(match.group(), 'foo')
6d2a5b2
 
6d2a5b2
     def test_matching(self):
6d2a5b2
         self.assertIsNone(self.lazyre.match('bar'))
6d2a5b2
         match = self.lazyre.match('foobar')
6d2a5b2
-        self.assertEquals(match.group(), 'foo')
6d2a5b2
+        self.assertEqual(match.group(), 'foo')
6d2a5b2
 
6d2a5b2
     def test_matching_with_position_parameters(self):
6d2a5b2
         self.assertIsNone(self.lazyre.match('foo', 1))
6d2a5b2
@@ -456,56 +456,56 @@ def test_matching_with_position_parameters(self):
6d2a5b2
     def test_searching(self):
6d2a5b2
         self.assertIsNone(self.lazyre.search('rafuubar'))
6d2a5b2
         match = self.lazyre.search('rafoobar')
6d2a5b2
-        self.assertEquals(match.group(), 'foo')
6d2a5b2
+        self.assertEqual(match.group(), 'foo')
6d2a5b2
 
6d2a5b2
     def test_searching_with_position_parameters(self):
6d2a5b2
         self.assertIsNone(self.lazyre.search('rafoobar', 3))
6d2a5b2
         self.assertIsNone(self.lazyre.search('rafoobar', 0, 4))
6d2a5b2
         match = self.lazyre.search('rafoofuobar', 4)
6d2a5b2
-        self.assertEquals(match.group(), 'fuo')
6d2a5b2
+        self.assertEqual(match.group(), 'fuo')
6d2a5b2
 
6d2a5b2
     def test_split(self):
6d2a5b2
-        self.assertEquals(self.lazyre.split('rafoobarfoobaz'),
6d2a5b2
+        self.assertEqual(self.lazyre.split('rafoobarfoobaz'),
6d2a5b2
                           ['ra', 'bar', 'baz'])
6d2a5b2
-        self.assertEquals(self.lazyre.split('rafoobarfoobaz', 1),
6d2a5b2
+        self.assertEqual(self.lazyre.split('rafoobarfoobaz', 1),
6d2a5b2
                           ['ra', 'barfoobaz'])
6d2a5b2
 
6d2a5b2
     def test_findall(self):
6d2a5b2
-        self.assertEquals(self.lazyre.findall('rafoobarfuobaz'),
6d2a5b2
+        self.assertEqual(self.lazyre.findall('rafoobarfuobaz'),
6d2a5b2
                           ['foo', 'fuo'])
6d2a5b2
 
6d2a5b2
     def test_finditer(self):
6d2a5b2
         result = self.lazyre.finditer('rafoobarfuobaz')
6d2a5b2
-        self.assertEquals([m.group() for m in result], ['foo', 'fuo'])
6d2a5b2
+        self.assertEqual([m.group() for m in result], ['foo', 'fuo'])
6d2a5b2
 
6d2a5b2
     def test_sub(self):
6d2a5b2
-        self.assertEquals(self.lazyre.sub('bar', 'foofoo'), 'barbar')
6d2a5b2
-        self.assertEquals(self.lazyre.sub(lambda x: 'baz', 'foofoo'), 'bazbaz')
6d2a5b2
+        self.assertEqual(self.lazyre.sub('bar', 'foofoo'), 'barbar')
6d2a5b2
+        self.assertEqual(self.lazyre.sub(lambda x: 'baz', 'foofoo'), 'bazbaz')
6d2a5b2
 
6d2a5b2
     def test_subn(self):
6d2a5b2
         subbed = self.lazyre.subn('bar', 'foofoo')
6d2a5b2
-        self.assertEquals(subbed, ('barbar', 2))
6d2a5b2
+        self.assertEqual(subbed, ('barbar', 2))
6d2a5b2
         subbed = self.lazyre.subn(lambda x: 'baz', 'foofoo')
6d2a5b2
-        self.assertEquals(subbed, ('bazbaz', 2))
6d2a5b2
+        self.assertEqual(subbed, ('bazbaz', 2))
6d2a5b2
 
6d2a5b2
     def test_groups(self):
6d2a5b2
         lazyre = LazyRegex('(.)(.)')
6d2a5b2
         self.assertIsNone(lazyre.groups)
6d2a5b2
         lazyre.ensure()
6d2a5b2
-        self.assertEquals(lazyre.groups, 2)
6d2a5b2
+        self.assertEqual(lazyre.groups, 2)
6d2a5b2
 
6d2a5b2
     def test_groupindex(self):
6d2a5b2
         lazyre = LazyRegex('(?P<foo>.)')
6d2a5b2
         self.assertIsNone(lazyre.groupindex)
6d2a5b2
         lazyre.ensure()
6d2a5b2
-        self.assertEquals(lazyre.groupindex, {'foo': 1})
6d2a5b2
+        self.assertEqual(lazyre.groupindex, {'foo': 1})
6d2a5b2
 
6d2a5b2
     def test_flags(self):
6d2a5b2
         self.lazyre.ensure()
6d2a5b2
-        self.assertEquals(self.lazyre.flags, re.compile('.').flags)
6d2a5b2
+        self.assertEqual(self.lazyre.flags, re.compile('.').flags)
6d2a5b2
 
6d2a5b2
     def test_pattern(self):
6d2a5b2
-        self.assertEquals(self.lazyre.pattern, 'f.o')
6d2a5b2
+        self.assertEqual(self.lazyre.pattern, 'f.o')
6d2a5b2
 
6d2a5b2
 
6d2a5b2
 if __name__ == '__main__':
6d2a5b2
6d2a5b2
From 9857454707a3687ff6617f4f7afdaf30f75b53ea Mon Sep 17 00:00:00 2001
6d2a5b2
From: Hugo van Kemenade <hugovk@users.noreply.github.com>
6d2a5b2
Date: Fri, 31 Dec 2021 00:42:50 +0200
6d2a5b2
Subject: [PATCH 2/2] Upgrade other unittest asserts for clearer error messages
6d2a5b2
6d2a5b2
---
6d2a5b2
 css_parser_tests/basetest.py                  |   9 +-
6d2a5b2
 css_parser_tests/test_codec.py                |   4 +-
6d2a5b2
 css_parser_tests/test_csscharsetrule.py       |   8 +-
6d2a5b2
 css_parser_tests/test_csscomment.py           |   4 +-
6d2a5b2
 css_parser_tests/test_cssfontfacerule.py      | 484 ++++++------
6d2a5b2
 css_parser_tests/test_cssimportrule.py        |  10 +-
6d2a5b2
 css_parser_tests/test_cssmediarule.py         |   6 +-
6d2a5b2
 css_parser_tests/test_cssnamespacerule.py     |  10 +-
6d2a5b2
 css_parser_tests/test_csspagerule.py          |   6 +-
6d2a5b2
 css_parser_tests/test_cssstyledeclaration.py  |  14 +-
6d2a5b2
 css_parser_tests/test_cssstylerule.py         |   6 +-
6d2a5b2
 css_parser_tests/test_cssstylesheet.py        |  18 +-
6d2a5b2
 css_parser_tests/test_cssunknownrule.py       |   2 +-
6d2a5b2
 css_parser_tests/test_cssutils.py             |  14 +-
6d2a5b2
 .../test_cssvariablesdeclaration.py           | 700 +++++++++---------
6d2a5b2
 css_parser_tests/test_cssvariablesrule.py     | 310 ++++----
6d2a5b2
 css_parser_tests/test_domimplementation.py    |  90 +--
6d2a5b2
 css_parser_tests/test_marginrule.py           |   6 +-
6d2a5b2
 css_parser_tests/test_medialist.py            |   6 +-
6d2a5b2
 css_parser_tests/test_mediaquery.py           | 216 +++---
6d2a5b2
 css_parser_tests/test_property.py             |  14 +-
6d2a5b2
 css_parser_tests/test_selector.py             |   6 +-
6d2a5b2
 css_parser_tests/test_selectorlist.py         |   4 +-
6d2a5b2
 css_parser_tests/test_value.py                |  48 +-
6d2a5b2
 24 files changed, 998 insertions(+), 997 deletions(-)
6d2a5b2
6d2a5b2
diff --git a/css_parser_tests/basetest.py b/css_parser_tests/basetest.py
6d2a5b2
index f45a620..ecb79a3 100644
6d2a5b2
--- a/css_parser_tests/basetest.py
6d2a5b2
+++ b/css_parser_tests/basetest.py
6d2a5b2
@@ -131,10 +131,11 @@ def assertRaisesEx(self, exception, callable, *args, **kwargs):
6d2a5b2
             callable(*args, **kwargs)
6d2a5b2
         except exception as exc:
6d2a5b2
             if exc_args is not None:
6d2a5b2
-                self.failIf(exc.args != exc_args,
6d2a5b2
-                            "%s raised %s with unexpected args: "
6d2a5b2
-                            "expected=%r, actual=%r"
6d2a5b2
-                            % (callsig, exc.__class__, exc_args, exc.args))
6d2a5b2
+                self.assertEqual(
6d2a5b2
+                    exc.args,
6d2a5b2
+                    exc_args,
6d2a5b2
+                    '%s raised %s with unexpected args: expected=%r, actual=%r' % (callsig, exc.__class__, exc_args, exc.args)
6d2a5b2
+                )
6d2a5b2
             if exc_pattern is not None:
6d2a5b2
                 self.assertTrue(exc_pattern.search(str(exc)),
6d2a5b2
                                 "%s raised %s, but the exception "
6d2a5b2
diff --git a/css_parser_tests/test_codec.py b/css_parser_tests/test_codec.py
6d2a5b2
index 1771162..d72499c 100644
6d2a5b2
--- a/css_parser_tests/test_codec.py
6d2a5b2
+++ b/css_parser_tests/test_codec.py
6d2a5b2
@@ -117,10 +117,10 @@ def test_detectencoding_unicode(self):
6d2a5b2
     def test_fixencoding(self):
6d2a5b2
         "codec._fixencoding()"
6d2a5b2
         s = '@charset "'
6d2a5b2
-        self.assertTrue(codec._fixencoding(s, "utf-8") is None)
6d2a5b2
+        self.assertIsNone(codec._fixencoding(s, 'utf-8'))
6d2a5b2
 
6d2a5b2
         s = '@charset "x'
6d2a5b2
-        self.assertTrue(codec._fixencoding(s, "utf-8") is None)
6d2a5b2
+        self.assertIsNone(codec._fixencoding(s, 'utf-8'))
6d2a5b2
 
6d2a5b2
         s = '@charset "x'
6d2a5b2
         self.assertEqual(codec._fixencoding(s, "utf-8", True), s)
6d2a5b2
diff --git a/css_parser_tests/test_csscharsetrule.py b/css_parser_tests/test_csscharsetrule.py
6d2a5b2
index 5a8a29e..cc5f347 100644
6d2a5b2
--- a/css_parser_tests/test_csscharsetrule.py
6d2a5b2
+++ b/css_parser_tests/test_csscharsetrule.py
6d2a5b2
@@ -107,7 +107,7 @@ def test_cssText(self):
6d2a5b2
     def test_repr(self):
6d2a5b2
         "CSSCharsetRule.__repr__()"
6d2a5b2
         self.r.encoding = 'utf-8'
6d2a5b2
-        self.assertTrue('utf-8' in repr(self.r))
6d2a5b2
+        self.assertIn('utf-8', repr(self.r))
6d2a5b2
 
6d2a5b2
     def test_reprANDstr(self):
6d2a5b2
         "CSSCharsetRule.__repr__(), .__str__()"
6d2a5b2
@@ -115,11 +115,11 @@ def test_reprANDstr(self):
6d2a5b2
 
6d2a5b2
         s = css_parser.css.CSSCharsetRule(encoding=encoding)
6d2a5b2
 
6d2a5b2
-        self.assertTrue(encoding in str(s))
6d2a5b2
+        self.assertIn(encoding, str(s))
6d2a5b2
 
6d2a5b2
         s2 = eval(repr(s))
6d2a5b2
-        self.assertTrue(isinstance(s2, s.__class__))
6d2a5b2
-        self.assertTrue(encoding == s2.encoding)
6d2a5b2
+        self.assertIsInstance(s2, s.__class__)
6d2a5b2
+        self.assertEqual(encoding, s2.encoding)
6d2a5b2
 
6d2a5b2
 
6d2a5b2
 if __name__ == '__main__':
6d2a5b2
diff --git a/css_parser_tests/test_csscomment.py b/css_parser_tests/test_csscomment.py
6d2a5b2
index 25bd920..864257d 100644
6d2a5b2
--- a/css_parser_tests/test_csscomment.py
6d2a5b2
+++ b/css_parser_tests/test_csscomment.py
6d2a5b2
@@ -66,8 +66,8 @@ def test_reprANDstr(self):
6d2a5b2
         s = css_parser.css.CSSComment(cssText=text)
6d2a5b2
 
6d2a5b2
         s2 = eval(repr(s))
6d2a5b2
-        self.assertTrue(isinstance(s2, s.__class__))
6d2a5b2
-        self.assertTrue(text == s2.cssText)
6d2a5b2
+        self.assertIsInstance(s2, s.__class__)
6d2a5b2
+        self.assertEqual(text, s2.cssText)
6d2a5b2
 
6d2a5b2
 
6d2a5b2
 if __name__ == '__main__':
6d2a5b2
diff --git a/css_parser_tests/test_cssfontfacerule.py b/css_parser_tests/test_cssfontfacerule.py
6d2a5b2
index e5112c7..244e27f 100644
6d2a5b2
--- a/css_parser_tests/test_cssfontfacerule.py
6d2a5b2
+++ b/css_parser_tests/test_cssfontfacerule.py
6d2a5b2
@@ -1,244 +1,244 @@
6d2a5b2
-"""Testcases for css_parser.css.CSSFontFaceRule"""
6d2a5b2
-
6d2a5b2
+"""Testcases for css_parser.css.CSSFontFaceRule"""
6d2a5b2
+
6d2a5b2
 from __future__ import absolute_import
6d2a5b2
 from __future__ import unicode_literals
6d2a5b2
-import xml.dom
6d2a5b2
-from . import test_cssrule
6d2a5b2
-import css_parser
6d2a5b2
-
6d2a5b2
-
6d2a5b2
-class CSSFontFaceRuleTestCase(test_cssrule.CSSRuleTestCase):
6d2a5b2
-
6d2a5b2
-    def setUp(self):
6d2a5b2
-        super(CSSFontFaceRuleTestCase, self).setUp()
6d2a5b2
-        self.r = css_parser.css.CSSFontFaceRule()
6d2a5b2
-        self.rRO = css_parser.css.CSSFontFaceRule(readonly=True)
6d2a5b2
-        self.r_type = css_parser.css.CSSFontFaceRule.FONT_FACE_RULE
6d2a5b2
-        self.r_typeString = 'FONT_FACE_RULE'
6d2a5b2
-
6d2a5b2
-    def test_init(self):
6d2a5b2
-        "CSSFontFaceRule.__init__()"
6d2a5b2
-        super(CSSFontFaceRuleTestCase, self).test_init()
6d2a5b2
-
6d2a5b2
-        r = css_parser.css.CSSFontFaceRule()
6d2a5b2
-        self.assertTrue(isinstance(r.style, css_parser.css.CSSStyleDeclaration))
6d2a5b2
-        self.assertEqual(r, r.style.parentRule)
6d2a5b2
-
6d2a5b2
-        # until any properties
6d2a5b2
-        self.assertEqual('', r.cssText)
6d2a5b2
-
6d2a5b2
-        # only possible to set @... similar name
6d2a5b2
-        self.assertRaises(xml.dom.InvalidModificationErr, self.r._setAtkeyword, 'x')
6d2a5b2
-
6d2a5b2
-        def checkrefs(ff):
6d2a5b2
-            self.assertEqual(ff, ff.style.parentRule)
6d2a5b2
-            for p in ff.style:
6d2a5b2
-                self.assertEqual(ff.style, p.parent)
6d2a5b2
-
6d2a5b2
-        checkrefs(css_parser.css.CSSFontFaceRule(
6d2a5b2
-            style=css_parser.css.CSSStyleDeclaration('font-family: x')))
6d2a5b2
-
6d2a5b2
-        r = css_parser.css.CSSFontFaceRule()
6d2a5b2
-        r.cssText = '@font-face { font-family: x }'
6d2a5b2
-        checkrefs(r)
6d2a5b2
-
6d2a5b2
-        r = css_parser.css.CSSFontFaceRule()
6d2a5b2
-        r.style.setProperty('font-family', 'y')
6d2a5b2
-        checkrefs(r)
6d2a5b2
-
6d2a5b2
-        r = css_parser.css.CSSFontFaceRule()
6d2a5b2
-        r.style['font-family'] = 'z'
6d2a5b2
-        checkrefs(r)
6d2a5b2
-
6d2a5b2
-        r = css_parser.css.CSSFontFaceRule()
6d2a5b2
-        r.style.fontFamily = 'a'
6d2a5b2
-        checkrefs(r)
6d2a5b2
-
6d2a5b2
-    def test_cssText(self):
6d2a5b2
-        "CSSFontFaceRule.cssText"
6d2a5b2
-        tests = {
6d2a5b2
-            '''@font-face {
6d2a5b2
-    font-family: x;
6d2a5b2
-    src: url(../fonts/LateefRegAAT.ttf) format("truetype-aat"), url(../fonts/LateefRegOT.ttf) format("opentype");
6d2a5b2
-    font-style: italic;
6d2a5b2
-    font-weight: 500;
6d2a5b2
-    font-stretch: condensed;
6d2a5b2
-    unicode-range: u+1-ff, u+111
6d2a5b2
-    }''': None,
6d2a5b2
-            '@font-face{font-family: x;}': '@font-face {\n    font-family: x\n    }',
6d2a5b2
-            '@font-face  {  font-family: x;  }': '@font-face {\n    font-family: x\n    }',
6d2a5b2
-            '@f\\ont\\-face{font-family : x;}': '@font-face {\n    font-family: x\n    }',
6d2a5b2
-            # comments
6d2a5b2
-            '@font-face/*1*//*2*/{font-family: x;}':
6d2a5b2
-                '@font-face /*1*/ /*2*/ {\n    font-family: x\n    }',
6d2a5b2
-            # WS
6d2a5b2
-            '@font-face\n\t\f {\n\t\f font-family:x;\n\t\f }':
6d2a5b2
-                '@font-face {\n    font-family: x\n    }',
6d2a5b2
-        }
6d2a5b2
-        self.do_equal_r(tests)
6d2a5b2
-        self.do_equal_p(tests)
6d2a5b2
-
6d2a5b2
-        tests = {
6d2a5b2
-            '@font-face;': xml.dom.SyntaxErr,
6d2a5b2
-            '@font-face }': xml.dom.SyntaxErr,
6d2a5b2
-        }
6d2a5b2
-        self.do_raise_p(tests)  # parse
6d2a5b2
-        tests.update({
6d2a5b2
-            '@font-face {': xml.dom.SyntaxErr,  # no }
6d2a5b2
-            # trailing
6d2a5b2
-            '@font-face {}1': xml.dom.SyntaxErr,
6d2a5b2
-            '@font-face {}/**/': xml.dom.SyntaxErr,
6d2a5b2
-            '@font-face {} ': xml.dom.SyntaxErr,
6d2a5b2
-        })
6d2a5b2
-        self.do_raise_r(tests)  # set cssText
6d2a5b2
-
6d2a5b2
-    def test_style(self):
6d2a5b2
-        "CSSFontFaceRule.style (and references)"
6d2a5b2
-        r = css_parser.css.CSSFontFaceRule()
6d2a5b2
-        s1 = r.style
6d2a5b2
-        self.assertEqual(r, s1.parentRule)
6d2a5b2
-        self.assertEqual('', s1.cssText)
6d2a5b2
-
6d2a5b2
-        # set rule.cssText
6d2a5b2
-        r.cssText = '@font-face { font-family: x1 }'
6d2a5b2
-        self.assertNotEqual(r.style, s1)
6d2a5b2
-        self.assertEqual(r, r.style.parentRule)
6d2a5b2
-        self.assertEqual(r.cssText, '@font-face {\n    font-family: x1\n    }')
6d2a5b2
-        self.assertEqual(r.style.cssText, 'font-family: x1')
6d2a5b2
-        self.assertEqual(s1.cssText, '')
6d2a5b2
-        s2 = r.style
6d2a5b2
-
6d2a5b2
-        # set invalid rule.cssText
6d2a5b2
-        try:
6d2a5b2
-            r.cssText = '@font-face { $ }'
6d2a5b2
-        except xml.dom.SyntaxErr as e:
6d2a5b2
-            pass
6d2a5b2
-        self.assertEqual(r.style, s2)
6d2a5b2
-        self.assertEqual(r, s2.parentRule)
6d2a5b2
-        self.assertEqual(r.cssText, '@font-face {\n    font-family: x1\n    }')
6d2a5b2
-        self.assertEqual(s2.cssText, 'font-family: x1')
6d2a5b2
-        self.assertEqual(r.style.cssText, 'font-family: x1')
6d2a5b2
-
6d2a5b2
-        # set rule.style.cssText
6d2a5b2
-        r.style.cssText = 'font-family: x2'
6d2a5b2
-        self.assertEqual(r.style, s2)
6d2a5b2
-        self.assertEqual(r, s2.parentRule)
6d2a5b2
-        self.assertEqual(r.cssText, '@font-face {\n    font-family: x2\n    }')
6d2a5b2
-        self.assertEqual(s2.cssText, 'font-family: x2')
6d2a5b2
-        self.assertEqual(r.style.cssText, 'font-family: x2')
6d2a5b2
-
6d2a5b2
-        # set new style object s2
6d2a5b2
-        sn = css_parser.css.CSSStyleDeclaration('font-family: y1')
6d2a5b2
-        r.style = sn
6d2a5b2
-        self.assertEqual(r.style, sn)
6d2a5b2
-        self.assertEqual(r, sn.parentRule)
6d2a5b2
-        self.assertEqual(r.cssText, '@font-face {\n    font-family: y1\n    }')
6d2a5b2
-        self.assertEqual(sn.cssText, 'font-family: y1')
6d2a5b2
-        self.assertEqual(r.style.cssText, 'font-family: y1')
6d2a5b2
-        self.assertEqual(s2.cssText, 'font-family: x2')  # old
6d2a5b2
-
6d2a5b2
-        # set s2.cssText
6d2a5b2
-        sn.cssText = 'font-family: y2'
6d2a5b2
-        self.assertEqual(r.style, sn)
6d2a5b2
-        self.assertEqual(r.cssText, '@font-face {\n    font-family: y2\n    }')
6d2a5b2
-        self.assertEqual(r.style.cssText, 'font-family: y2')
6d2a5b2
-        self.assertEqual(s2.cssText, 'font-family: x2')  # old
6d2a5b2
-
6d2a5b2
-        # set invalid s2.cssText
6d2a5b2
-        try:
6d2a5b2
-            sn.cssText = '$'
6d2a5b2
-        except xml.dom.SyntaxErr as e:
6d2a5b2
-            pass
6d2a5b2
-        self.assertEqual(r.style, sn)
6d2a5b2
-        self.assertEqual(r.style.cssText, 'font-family: y2')
6d2a5b2
-        self.assertEqual(r.cssText, '@font-face {\n    font-family: y2\n    }')
6d2a5b2
-
6d2a5b2
-        # set r.style with text
6d2a5b2
-        r.style = 'font-family: z'
6d2a5b2
-        self.assertNotEqual(r.style, sn)
6d2a5b2
-        self.assertEqual(r.cssText, '@font-face {\n    font-family: z\n    }')
6d2a5b2
-        self.assertEqual(r.style.cssText, 'font-family: z')
6d2a5b2
-        self.assertEqual(sn.cssText, 'font-family: y2')
6d2a5b2
-
6d2a5b2
-    def test_properties(self):
6d2a5b2
-        "CSSFontFaceRule.style properties"
6d2a5b2
-        r = css_parser.css.CSSFontFaceRule()
6d2a5b2
-        r.style.cssText = '''
6d2a5b2
-        src: url(x)
6d2a5b2
-        '''
6d2a5b2
-        exp = '''@font-face {
6d2a5b2
-    src: url(x)
6d2a5b2
-    }'''
6d2a5b2
-        self.assertEqual(exp, r.cssText)
6d2a5b2
-
6d2a5b2
-        tests = {
6d2a5b2
-            'font-family': [  # ('serif', True),
6d2a5b2
-                #                            ('x', True),
6d2a5b2
-                #                            ('"x"', True),
6d2a5b2
-                ('x, y', False),
6d2a5b2
-                ('"x", y', False),
6d2a5b2
-                ('x, "y"', False),
6d2a5b2
-                #                            ('"x", "y"', False)
6d2a5b2
-            ]
6d2a5b2
-        }
6d2a5b2
-        for n, t in tests.items():
6d2a5b2
-            for (v, valid) in t:
6d2a5b2
-                r = css_parser.css.CSSFontFaceRule()
6d2a5b2
-                r.style[n] = v
6d2a5b2
-                self.assertEqual(r.style.getProperty(n).parent, r.style)
6d2a5b2
-                self.assertEqual(r.style.getProperty(n).valid, valid)
6d2a5b2
-
6d2a5b2
-    def test_incomplete(self):
6d2a5b2
-        "CSSFontFaceRule (incomplete)"
6d2a5b2
-        tests = {
6d2a5b2
-            '@font-face{':
6d2a5b2
-                '',  # no } and no content
6d2a5b2
-            '@font-face { ':
6d2a5b2
-                '',  # no } and no content
6d2a5b2
-            '@font-face { font-family: x':
6d2a5b2
-                '@font-face {\n    font-family: x\n    }',  # no }
6d2a5b2
-        }
6d2a5b2
-        self.do_equal_p(tests)  # parse
6d2a5b2
-
6d2a5b2
-    def test_InvalidModificationErr(self):
6d2a5b2
-        "CSSFontFaceRule.cssText InvalidModificationErr"
6d2a5b2
-        self._test_InvalidModificationErr('@font-face')
6d2a5b2
-        tests = {
6d2a5b2
-            '@font-fac {}': xml.dom.InvalidModificationErr,
6d2a5b2
-        }
6d2a5b2
-        self.do_raise_r(tests)
6d2a5b2
-
6d2a5b2
-    def test_valid(self):
6d2a5b2
-        "CSSFontFaceRule.valid"
6d2a5b2
-        r = css_parser.css.CSSFontFaceRule()
6d2a5b2
-        self.assertEqual(False, r.valid)
6d2a5b2
-        N = 'font-family: x; src: local(x);'
6d2a5b2
-        tests = {
6d2a5b2
-            True: (N,
6d2a5b2
-                   N + 'font-style: italic; font-weight: bold',
6d2a5b2
-                   ),
6d2a5b2
-            False: ('',
6d2a5b2
-                    'font-family: x, y; src: local(x);',
6d2a5b2
-                    N + 'font-style: inherit',
6d2a5b2
-                    N + 'invalid: 1')
6d2a5b2
-        }
6d2a5b2
-        for valid, testlist in tests.items():
6d2a5b2
-            for test in testlist:
6d2a5b2
-                r.style.cssText = test
6d2a5b2
-                self.assertEqual(valid, r.valid)
6d2a5b2
-
6d2a5b2
-    def test_reprANDstr(self):
6d2a5b2
-        "CSSFontFaceRule.__repr__(), .__str__()"
6d2a5b2
-        style = 'src: url(x)'
6d2a5b2
-        s = css_parser.css.CSSFontFaceRule(style=style)
6d2a5b2
-
6d2a5b2
-        self.assertTrue(style in str(s))
6d2a5b2
-
6d2a5b2
-        s2 = eval(repr(s))
6d2a5b2
-        self.assertTrue(isinstance(s2, s.__class__))
6d2a5b2
-        self.assertTrue(style == s2.style.cssText)
6d2a5b2
-
6d2a5b2
-
6d2a5b2
-if __name__ == '__main__':
6d2a5b2
-    import unittest
6d2a5b2
-    unittest.main()
6d2a5b2
+import xml.dom
6d2a5b2
+from . import test_cssrule
6d2a5b2
+import css_parser
6d2a5b2
+
6d2a5b2
+
6d2a5b2
+class CSSFontFaceRuleTestCase(test_cssrule.CSSRuleTestCase):
6d2a5b2
+
6d2a5b2
+    def setUp(self):
6d2a5b2
+        super(CSSFontFaceRuleTestCase, self).setUp()
6d2a5b2
+        self.r = css_parser.css.CSSFontFaceRule()
6d2a5b2
+        self.rRO = css_parser.css.CSSFontFaceRule(readonly=True)
6d2a5b2
+        self.r_type = css_parser.css.CSSFontFaceRule.FONT_FACE_RULE
6d2a5b2
+        self.r_typeString = 'FONT_FACE_RULE'
6d2a5b2
+
6d2a5b2
+    def test_init(self):
6d2a5b2
+        "CSSFontFaceRule.__init__()"
6d2a5b2
+        super(CSSFontFaceRuleTestCase, self).test_init()
6d2a5b2
+
6d2a5b2
+        r = css_parser.css.CSSFontFaceRule()
6d2a5b2
+        self.assertIsInstance(r.style, css_parser.css.CSSStyleDeclaration)
6d2a5b2
+        self.assertEqual(r, r.style.parentRule)
6d2a5b2
+
6d2a5b2
+        # until any properties
6d2a5b2
+        self.assertEqual('', r.cssText)
6d2a5b2
+
6d2a5b2
+        # only possible to set @... similar name
6d2a5b2
+        self.assertRaises(xml.dom.InvalidModificationErr, self.r._setAtkeyword, 'x')
6d2a5b2
+
6d2a5b2
+        def checkrefs(ff):
6d2a5b2
+            self.assertEqual(ff, ff.style.parentRule)
6d2a5b2
+            for p in ff.style:
6d2a5b2
+                self.assertEqual(ff.style, p.parent)
6d2a5b2
+
6d2a5b2
+        checkrefs(css_parser.css.CSSFontFaceRule(
6d2a5b2
+            style=css_parser.css.CSSStyleDeclaration('font-family: x')))
6d2a5b2
+
6d2a5b2
+        r = css_parser.css.CSSFontFaceRule()
6d2a5b2
+        r.cssText = '@font-face { font-family: x }'
6d2a5b2
+        checkrefs(r)
6d2a5b2
+
6d2a5b2
+        r = css_parser.css.CSSFontFaceRule()
6d2a5b2
+        r.style.setProperty('font-family', 'y')
6d2a5b2
+        checkrefs(r)
6d2a5b2
+
6d2a5b2
+        r = css_parser.css.CSSFontFaceRule()
6d2a5b2
+        r.style['font-family'] = 'z'
6d2a5b2
+        checkrefs(r)
6d2a5b2
+
6d2a5b2
+        r = css_parser.css.CSSFontFaceRule()
6d2a5b2
+        r.style.fontFamily = 'a'
6d2a5b2
+        checkrefs(r)
6d2a5b2
+
6d2a5b2
+    def test_cssText(self):
6d2a5b2
+        "CSSFontFaceRule.cssText"
6d2a5b2
+        tests = {
6d2a5b2
+            '''@font-face {
6d2a5b2
+    font-family: x;
6d2a5b2
+    src: url(../fonts/LateefRegAAT.ttf) format("truetype-aat"), url(../fonts/LateefRegOT.ttf) format("opentype");
6d2a5b2
+    font-style: italic;
6d2a5b2
+    font-weight: 500;
6d2a5b2
+    font-stretch: condensed;
6d2a5b2
+    unicode-range: u+1-ff, u+111
6d2a5b2
+    }''': None,
6d2a5b2
+            '@font-face{font-family: x;}': '@font-face {\n    font-family: x\n    }',
6d2a5b2
+            '@font-face  {  font-family: x;  }': '@font-face {\n    font-family: x\n    }',
6d2a5b2
+            '@f\\ont\\-face{font-family : x;}': '@font-face {\n    font-family: x\n    }',
6d2a5b2
+            # comments
6d2a5b2
+            '@font-face/*1*//*2*/{font-family: x;}':
6d2a5b2
+                '@font-face /*1*/ /*2*/ {\n    font-family: x\n    }',
6d2a5b2
+            # WS
6d2a5b2
+            '@font-face\n\t\f {\n\t\f font-family:x;\n\t\f }':
6d2a5b2
+                '@font-face {\n    font-family: x\n    }',
6d2a5b2
+        }
6d2a5b2
+        self.do_equal_r(tests)
6d2a5b2
+        self.do_equal_p(tests)
6d2a5b2
+
6d2a5b2
+        tests = {
6d2a5b2
+            '@font-face;': xml.dom.SyntaxErr,
6d2a5b2
+            '@font-face }': xml.dom.SyntaxErr,
6d2a5b2
+        }
6d2a5b2
+        self.do_raise_p(tests)  # parse
6d2a5b2
+        tests.update({
6d2a5b2
+            '@font-face {': xml.dom.SyntaxErr,  # no }
6d2a5b2
+            # trailing
6d2a5b2
+            '@font-face {}1': xml.dom.SyntaxErr,
6d2a5b2
+            '@font-face {}/**/': xml.dom.SyntaxErr,
6d2a5b2
+            '@font-face {} ': xml.dom.SyntaxErr,
6d2a5b2
+        })
6d2a5b2
+        self.do_raise_r(tests)  # set cssText
6d2a5b2
+
6d2a5b2
+    def test_style(self):
6d2a5b2
+        "CSSFontFaceRule.style (and references)"
6d2a5b2
+        r = css_parser.css.CSSFontFaceRule()
6d2a5b2
+        s1 = r.style
6d2a5b2
+        self.assertEqual(r, s1.parentRule)
6d2a5b2
+        self.assertEqual('', s1.cssText)
6d2a5b2
+
6d2a5b2
+        # set rule.cssText
6d2a5b2
+        r.cssText = '@font-face { font-family: x1 }'
6d2a5b2
+        self.assertNotEqual(r.style, s1)
6d2a5b2
+        self.assertEqual(r, r.style.parentRule)
6d2a5b2
+        self.assertEqual(r.cssText, '@font-face {\n    font-family: x1\n    }')
6d2a5b2
+        self.assertEqual(r.style.cssText, 'font-family: x1')
6d2a5b2
+        self.assertEqual(s1.cssText, '')
6d2a5b2
+        s2 = r.style
6d2a5b2
+
6d2a5b2
+        # set invalid rule.cssText
6d2a5b2
+        try:
6d2a5b2
+            r.cssText = '@font-face { $ }'
6d2a5b2
+        except xml.dom.SyntaxErr as e:
6d2a5b2
+            pass
6d2a5b2
+        self.assertEqual(r.style, s2)
6d2a5b2
+        self.assertEqual(r, s2.parentRule)
6d2a5b2
+        self.assertEqual(r.cssText, '@font-face {\n    font-family: x1\n    }')
6d2a5b2
+        self.assertEqual(s2.cssText, 'font-family: x1')
6d2a5b2
+        self.assertEqual(r.style.cssText, 'font-family: x1')
6d2a5b2
+
6d2a5b2
+        # set rule.style.cssText
6d2a5b2
+        r.style.cssText = 'font-family: x2'
6d2a5b2
+        self.assertEqual(r.style, s2)
6d2a5b2
+        self.assertEqual(r, s2.parentRule)
6d2a5b2
+        self.assertEqual(r.cssText, '@font-face {\n    font-family: x2\n    }')
6d2a5b2
+        self.assertEqual(s2.cssText, 'font-family: x2')
6d2a5b2
+        self.assertEqual(r.style.cssText, 'font-family: x2')
6d2a5b2
+
6d2a5b2
+        # set new style object s2
6d2a5b2
+        sn = css_parser.css.CSSStyleDeclaration('font-family: y1')
6d2a5b2
+        r.style = sn
6d2a5b2
+        self.assertEqual(r.style, sn)
6d2a5b2
+        self.assertEqual(r, sn.parentRule)
6d2a5b2
+        self.assertEqual(r.cssText, '@font-face {\n    font-family: y1\n    }')
6d2a5b2
+        self.assertEqual(sn.cssText, 'font-family: y1')
6d2a5b2
+        self.assertEqual(r.style.cssText, 'font-family: y1')
6d2a5b2
+        self.assertEqual(s2.cssText, 'font-family: x2')  # old
6d2a5b2
+
6d2a5b2
+        # set s2.cssText
6d2a5b2
+        sn.cssText = 'font-family: y2'
6d2a5b2
+        self.assertEqual(r.style, sn)
6d2a5b2
+        self.assertEqual(r.cssText, '@font-face {\n    font-family: y2\n    }')
6d2a5b2
+        self.assertEqual(r.style.cssText, 'font-family: y2')
6d2a5b2
+        self.assertEqual(s2.cssText, 'font-family: x2')  # old
6d2a5b2
+
6d2a5b2
+        # set invalid s2.cssText
6d2a5b2
+        try:
6d2a5b2
+            sn.cssText = '$'
6d2a5b2
+        except xml.dom.SyntaxErr as e:
6d2a5b2
+            pass
6d2a5b2
+        self.assertEqual(r.style, sn)
6d2a5b2
+        self.assertEqual(r.style.cssText, 'font-family: y2')
6d2a5b2
+        self.assertEqual(r.cssText, '@font-face {\n    font-family: y2\n    }')
6d2a5b2
+
6d2a5b2
+        # set r.style with text
6d2a5b2
+        r.style = 'font-family: z'
6d2a5b2
+        self.assertNotEqual(r.style, sn)
6d2a5b2
+        self.assertEqual(r.cssText, '@font-face {\n    font-family: z\n    }')
6d2a5b2
+        self.assertEqual(r.style.cssText, 'font-family: z')
6d2a5b2
+        self.assertEqual(sn.cssText, 'font-family: y2')
6d2a5b2
+
6d2a5b2
+    def test_properties(self):
6d2a5b2
+        "CSSFontFaceRule.style properties"
6d2a5b2
+        r = css_parser.css.CSSFontFaceRule()
6d2a5b2
+        r.style.cssText = '''
6d2a5b2
+        src: url(x)
6d2a5b2
+        '''
6d2a5b2
+        exp = '''@font-face {
6d2a5b2
+    src: url(x)
6d2a5b2
+    }'''
6d2a5b2
+        self.assertEqual(exp, r.cssText)
6d2a5b2
+
6d2a5b2
+        tests = {
6d2a5b2
+            'font-family': [  # ('serif', True),
6d2a5b2
+                #                            ('x', True),
6d2a5b2
+                #                            ('"x"', True),
6d2a5b2
+                ('x, y', False),
6d2a5b2
+                ('"x", y', False),
6d2a5b2
+                ('x, "y"', False),
6d2a5b2
+                #                            ('"x", "y"', False)
6d2a5b2
+            ]
6d2a5b2
+        }
6d2a5b2
+        for n, t in tests.items():
6d2a5b2
+            for (v, valid) in t:
6d2a5b2
+                r = css_parser.css.CSSFontFaceRule()
6d2a5b2
+                r.style[n] = v
6d2a5b2
+                self.assertEqual(r.style.getProperty(n).parent, r.style)
6d2a5b2
+                self.assertEqual(r.style.getProperty(n).valid, valid)
6d2a5b2
+
6d2a5b2
+    def test_incomplete(self):
6d2a5b2
+        "CSSFontFaceRule (incomplete)"
6d2a5b2
+        tests = {
6d2a5b2
+            '@font-face{':
6d2a5b2
+                '',  # no } and no content
6d2a5b2
+            '@font-face { ':
6d2a5b2
+                '',  # no } and no content
6d2a5b2
+            '@font-face { font-family: x':
6d2a5b2
+                '@font-face {\n    font-family: x\n    }',  # no }
6d2a5b2
+        }
6d2a5b2
+        self.do_equal_p(tests)  # parse
6d2a5b2
+
6d2a5b2
+    def test_InvalidModificationErr(self):
6d2a5b2
+        "CSSFontFaceRule.cssText InvalidModificationErr"
6d2a5b2
+        self._test_InvalidModificationErr('@font-face')
6d2a5b2
+        tests = {
6d2a5b2
+            '@font-fac {}': xml.dom.InvalidModificationErr,
6d2a5b2
+        }
6d2a5b2
+        self.do_raise_r(tests)
6d2a5b2
+
6d2a5b2
+    def test_valid(self):
6d2a5b2
+        "CSSFontFaceRule.valid"
6d2a5b2
+        r = css_parser.css.CSSFontFaceRule()
6d2a5b2
+        self.assertEqual(False, r.valid)
6d2a5b2
+        N = 'font-family: x; src: local(x);'
6d2a5b2
+        tests = {
6d2a5b2
+            True: (N,
6d2a5b2
+                   N + 'font-style: italic; font-weight: bold',
6d2a5b2
+                   ),
6d2a5b2
+            False: ('',
6d2a5b2
+                    'font-family: x, y; src: local(x);',
6d2a5b2
+                    N + 'font-style: inherit',
6d2a5b2
+                    N + 'invalid: 1')
6d2a5b2
+        }
6d2a5b2
+        for valid, testlist in tests.items():
6d2a5b2
+            for test in testlist:
6d2a5b2
+                r.style.cssText = test
6d2a5b2
+                self.assertEqual(valid, r.valid)
6d2a5b2
+
6d2a5b2
+    def test_reprANDstr(self):
6d2a5b2
+        "CSSFontFaceRule.__repr__(), .__str__()"
6d2a5b2
+        style = 'src: url(x)'
6d2a5b2
+        s = css_parser.css.CSSFontFaceRule(style=style)
6d2a5b2
+
6d2a5b2
+        self.assertIn(style, str(s))
6d2a5b2
+
6d2a5b2
+        s2 = eval(repr(s))
6d2a5b2
+        self.assertIsInstance(s2, s.__class__)
6d2a5b2
+        self.assertEqual(style, s2.style.cssText)
6d2a5b2
+
6d2a5b2
+
6d2a5b2
+if __name__ == '__main__':
6d2a5b2
+    import unittest
6d2a5b2
+    unittest.main()
6d2a5b2
diff --git a/css_parser_tests/test_cssimportrule.py b/css_parser_tests/test_cssimportrule.py
6d2a5b2
index c475617..ba426f4 100644
6d2a5b2
--- a/css_parser_tests/test_cssimportrule.py
6d2a5b2
+++ b/css_parser_tests/test_cssimportrule.py
6d2a5b2
@@ -428,14 +428,14 @@ def test_reprANDstr(self):
6d2a5b2
         s = css_parser.css.CSSImportRule(href=href, mediaText=mediaText, name=name)
6d2a5b2
 
6d2a5b2
         # str(): mediaText nor name are present here
6d2a5b2
-        self.assertTrue(href in str(s))
6d2a5b2
+        self.assertIn(href, str(s))
6d2a5b2
 
6d2a5b2
         # repr()
6d2a5b2
         s2 = eval(repr(s))
6d2a5b2
-        self.assertTrue(isinstance(s2, s.__class__))
6d2a5b2
-        self.assertTrue(href == s2.href)
6d2a5b2
-        self.assertTrue(mediaText == s2.media.mediaText)
6d2a5b2
-        self.assertTrue(name == s2.name)
6d2a5b2
+        self.assertIsInstance(s2, s.__class__)
6d2a5b2
+        self.assertEqual(href, s2.href)
6d2a5b2
+        self.assertEqual(mediaText, s2.media.mediaText)
6d2a5b2
+        self.assertEqual(name, s2.name)
6d2a5b2
 
6d2a5b2
 
6d2a5b2
 if __name__ == '__main__':
6d2a5b2
diff --git a/css_parser_tests/test_cssmediarule.py b/css_parser_tests/test_cssmediarule.py
6d2a5b2
index 028d880..fd3a007 100644
6d2a5b2
--- a/css_parser_tests/test_cssmediarule.py
6d2a5b2
+++ b/css_parser_tests/test_cssmediarule.py
6d2a5b2
@@ -439,11 +439,11 @@ def test_reprANDstr(self):
6d2a5b2
 
6d2a5b2
         s = css_parser.css.CSSMediaRule(mediaText=mediaText)
6d2a5b2
 
6d2a5b2
-        self.assertTrue(mediaText in str(s))
6d2a5b2
+        self.assertIn(mediaText, str(s))
6d2a5b2
 
6d2a5b2
         s2 = eval(repr(s))
6d2a5b2
-        self.assertTrue(isinstance(s2, s.__class__))
6d2a5b2
-        self.assertTrue(mediaText == s2.media.mediaText)
6d2a5b2
+        self.assertIsInstance(s2, s.__class__)
6d2a5b2
+        self.assertEqual(mediaText, s2.media.mediaText)
6d2a5b2
 
6d2a5b2
 
6d2a5b2
 if __name__ == '__main__':
6d2a5b2
diff --git a/css_parser_tests/test_cssnamespacerule.py b/css_parser_tests/test_cssnamespacerule.py
6d2a5b2
index 6058134..0a5d20b 100644
6d2a5b2
--- a/css_parser_tests/test_cssnamespacerule.py
6d2a5b2
+++ b/css_parser_tests/test_cssnamespacerule.py
6d2a5b2
@@ -222,13 +222,13 @@ def test_reprANDstr(self):
6d2a5b2
 
6d2a5b2
         s = css_parser.css.CSSNamespaceRule(namespaceURI=namespaceURI, prefix=prefix)
6d2a5b2
 
6d2a5b2
-        self.assertTrue(namespaceURI in str(s))
6d2a5b2
-        self.assertTrue(prefix in str(s))
6d2a5b2
+        self.assertIn(namespaceURI, str(s))
6d2a5b2
+        self.assertIn(prefix, str(s))
6d2a5b2
 
6d2a5b2
         s2 = eval(repr(s))
6d2a5b2
-        self.assertTrue(isinstance(s2, s.__class__))
6d2a5b2
-        self.assertTrue(namespaceURI == s2.namespaceURI)
6d2a5b2
-        self.assertTrue(prefix == s2.prefix)
6d2a5b2
+        self.assertIsInstance(s2, s.__class__)
6d2a5b2
+        self.assertEqual(namespaceURI, s2.namespaceURI)
6d2a5b2
+        self.assertEqual(prefix, s2.prefix)
6d2a5b2
 
6d2a5b2
 
6d2a5b2
 if __name__ == '__main__':
6d2a5b2
diff --git a/css_parser_tests/test_csspagerule.py b/css_parser_tests/test_csspagerule.py
6d2a5b2
index 226cfe5..9a9a98d 100644
6d2a5b2
--- a/css_parser_tests/test_csspagerule.py
6d2a5b2
+++ b/css_parser_tests/test_csspagerule.py
6d2a5b2
@@ -422,11 +422,11 @@ def test_reprANDstr(self):
6d2a5b2
 
6d2a5b2
         s = css_parser.css.CSSPageRule(selectorText=sel)
6d2a5b2
 
6d2a5b2
-        self.assertTrue(sel in str(s))
6d2a5b2
+        self.assertIn(sel, str(s))
6d2a5b2
 
6d2a5b2
         s2 = eval(repr(s))
6d2a5b2
-        self.assertTrue(isinstance(s2, s.__class__))
6d2a5b2
-        self.assertTrue(sel == s2.selectorText)
6d2a5b2
+        self.assertIsInstance(s2, s.__class__)
6d2a5b2
+        self.assertEqual(sel, s2.selectorText)
6d2a5b2
 
6d2a5b2
 
6d2a5b2
 if __name__ == '__main__':
6d2a5b2
diff --git a/css_parser_tests/test_cssstyledeclaration.py b/css_parser_tests/test_cssstyledeclaration.py
6d2a5b2
index 0f16b11..a37f4c1 100644
6d2a5b2
--- a/css_parser_tests/test_cssstyledeclaration.py
6d2a5b2
+++ b/css_parser_tests/test_cssstyledeclaration.py
6d2a5b2
@@ -64,11 +64,11 @@ def test__contains__(self):
6d2a5b2
         "CSSStyleDeclaration.__contains__(nameOrProperty)"
6d2a5b2
         s = css_parser.css.CSSStyleDeclaration(cssText=r'x: 1;\y: 2')
6d2a5b2
         for test in ('x', r'x', 'y', r'y'):
6d2a5b2
-            self.assertTrue(test in s)
6d2a5b2
-            self.assertTrue(test.upper() in s)
6d2a5b2
-            self.assertTrue(css_parser.css.Property(test, '1') in s)
6d2a5b2
-        self.assertTrue('z' not in s)
6d2a5b2
-        self.assertTrue(css_parser.css.Property('z', '1') not in s)
6d2a5b2
+            self.assertIn(test, s)
6d2a5b2
+            self.assertIn(test.upper(), s)
6d2a5b2
+            self.assertIn(css_parser.css.Property(test, '1'), s)
6d2a5b2
+        self.assertNotIn('z', s)
6d2a5b2
+        self.assertNotIn(css_parser.css.Property('z', '1'), s)
6d2a5b2
 
6d2a5b2
     def test__iter__item(self):
6d2a5b2
         "CSSStyleDeclaration.__iter__ and .item"
6d2a5b2
@@ -584,10 +584,10 @@ def test_reprANDstr(self):
6d2a5b2
         "CSSStyleDeclaration.__repr__(), .__str__()"
6d2a5b2
         s = css_parser.css.CSSStyleDeclaration(cssText='a:1;b:2')
6d2a5b2
 
6d2a5b2
-        self.assertTrue("2" in str(s))  # length
6d2a5b2
+        self.assertIn('2', str(s)) # length
6d2a5b2
 
6d2a5b2
         s2 = eval(repr(s))
6d2a5b2
-        self.assertTrue(isinstance(s2, s.__class__))
6d2a5b2
+        self.assertIsInstance(s2, s.__class__)
6d2a5b2
 
6d2a5b2
     def test_valid(self):
6d2a5b2
         "CSSStyleDeclaration.valid"
6d2a5b2
diff --git a/css_parser_tests/test_cssstylerule.py b/css_parser_tests/test_cssstylerule.py
6d2a5b2
index db74668..0d00df9 100644
6d2a5b2
--- a/css_parser_tests/test_cssstylerule.py
6d2a5b2
+++ b/css_parser_tests/test_cssstylerule.py
6d2a5b2
@@ -241,11 +241,11 @@ def test_reprANDstr(self):
6d2a5b2
 
6d2a5b2
         s = css_parser.css.CSSStyleRule(selectorText=sel)
6d2a5b2
 
6d2a5b2
-        self.assertTrue(sel in str(s))
6d2a5b2
+        self.assertIn(sel, str(s))
6d2a5b2
 
6d2a5b2
         s2 = eval(repr(s))
6d2a5b2
-        self.assertTrue(isinstance(s2, s.__class__))
6d2a5b2
-        self.assertTrue(sel == s2.selectorText)
6d2a5b2
+        self.assertIsInstance(s2, s.__class__)
6d2a5b2
+        self.assertEqual(sel, s2.selectorText)
6d2a5b2
 
6d2a5b2
     def test_valid(self):
6d2a5b2
         "CSSStyleRule.valid"
6d2a5b2
diff --git a/css_parser_tests/test_cssstylesheet.py b/css_parser_tests/test_cssstylesheet.py
6d2a5b2
index fe50ff5..008447e 100644
6d2a5b2
--- a/css_parser_tests/test_cssstylesheet.py
6d2a5b2
+++ b/css_parser_tests/test_cssstylesheet.py
6d2a5b2
@@ -322,9 +322,9 @@ def test_namespaces1(self):
6d2a5b2
                          {'': 'default', 'ex2': 'example'})
6d2a5b2
 
6d2a5b2
         # __contains__
6d2a5b2
-        self.assertTrue('' in s.namespaces)
6d2a5b2
-        self.assertTrue('ex2' in s.namespaces)
6d2a5b2
-        self.assertFalse('NOTSET' in s.namespaces)
6d2a5b2
+        self.assertIn('', s.namespaces)
6d2a5b2
+        self.assertIn('ex2', s.namespaces)
6d2a5b2
+        self.assertNotIn('NOTSET', s.namespaces)
6d2a5b2
         # __delitem__
6d2a5b2
         self.assertRaises(xml.dom.NoModificationAllowedErr,
6d2a5b2
                           s.namespaces.__delitem__, 'ex2')
6d2a5b2
@@ -450,7 +450,7 @@ def test_namespaces3(self):
6d2a5b2
         self.assertRaises(xml.dom.NamespaceErr, s.add, css)
6d2a5b2
 
6d2a5b2
         s.add('@namespace x "html";')
6d2a5b2
-        self.assertTrue(s.namespaces['x'] == 'html')
6d2a5b2
+        self.assertEqual(s.namespaces['x'], 'html')
6d2a5b2
 
6d2a5b2
         r = css_parser.css.CSSStyleRule()
6d2a5b2
         r.cssText = ((css, {'h': 'html'}))
6d2a5b2
@@ -871,13 +871,13 @@ def test_reprANDstr(self):
6d2a5b2
 
6d2a5b2
         s = css_parser.css.CSSStyleSheet(href=href, title=title)
6d2a5b2
 
6d2a5b2
-        self.assertTrue(href in str(s))
6d2a5b2
-        self.assertTrue(title in str(s))
6d2a5b2
+        self.assertIn(href, str(s))
6d2a5b2
+        self.assertIn(title, str(s))
6d2a5b2
 
6d2a5b2
         s2 = eval(repr(s))
6d2a5b2
-        self.assertTrue(isinstance(s2, s.__class__))
6d2a5b2
-        self.assertTrue(href == s2.href)
6d2a5b2
-        self.assertTrue(title == s2.title)
6d2a5b2
+        self.assertIsInstance(s2, s.__class__)
6d2a5b2
+        self.assertEqual(href, s2.href)
6d2a5b2
+        self.assertEqual(title, s2.title)
6d2a5b2
 
6d2a5b2
     def test_valid(self):
6d2a5b2
         cases = [
6d2a5b2
diff --git a/css_parser_tests/test_cssunknownrule.py b/css_parser_tests/test_cssunknownrule.py
6d2a5b2
index 9d5c398..3c8e4d0 100644
6d2a5b2
--- a/css_parser_tests/test_cssunknownrule.py
6d2a5b2
+++ b/css_parser_tests/test_cssunknownrule.py
6d2a5b2
@@ -146,7 +146,7 @@ def test_reprANDstr(self):
6d2a5b2
         s = css_parser.css.CSSUnknownRule(cssText='@x;')
6d2a5b2
 
6d2a5b2
         s2 = eval(repr(s))
6d2a5b2
-        self.assertTrue(isinstance(s2, s.__class__))
6d2a5b2
+        self.assertIsInstance(s2, s.__class__)
6d2a5b2
 
6d2a5b2
 
6d2a5b2
 if __name__ == '__main__':
6d2a5b2
diff --git a/css_parser_tests/test_cssutils.py b/css_parser_tests/test_cssutils.py
6d2a5b2
index cc8e7ff..a60f65c 100644
6d2a5b2
--- a/css_parser_tests/test_cssutils.py
6d2a5b2
+++ b/css_parser_tests/test_cssutils.py
6d2a5b2
@@ -63,7 +63,7 @@ def test_parseString(self):
6d2a5b2
         "css_parser.parseString()"
6d2a5b2
         s = css_parser.parseString(
6d2a5b2
             self.exp, media='handheld, screen', title='from string')
6d2a5b2
-        self.assertTrue(isinstance(s, css_parser.css.CSSStyleSheet))
6d2a5b2
+        self.assertIsInstance(s, css_parser.css.CSSStyleSheet)
6d2a5b2
         self.assertEqual(None, s.href)
6d2a5b2
         self.assertEqual(self.exp.encode(), s.cssText)
6d2a5b2
         self.assertEqual('utf-8', s.encoding)
6d2a5b2
@@ -84,7 +84,7 @@ def test_parseString(self):
6d2a5b2
         ir = s.cssRules[0]
6d2a5b2
         self.assertEqual('import/import2.css', ir.href)
6d2a5b2
         irs = ir.styleSheet
6d2a5b2
-        self.assertTrue(isinstance(irs, css_parser.css.CSSStyleSheet))
6d2a5b2
+        self.assertIsInstance(irs, css_parser.css.CSSStyleSheet)
6d2a5b2
         self.assertEqual(
6d2a5b2
             irs.cssText,
6d2a5b2
             '@import "../import3.css";\n@import "import-impossible.css" print;\n.import2 {\n    /* sheets/import2.css */\n    background: url(http://example.com/images/example.gif);\n    background: url(//example.com/images/example.gif);\n    background: url(/images/example.gif);\n    background: url(images2/example.gif);\n    background: url(./images2/example.gif);\n    background: url(../images/example.gif);\n    background: url(./../images/example.gif)\n    }'  # noqa
6d2a5b2
@@ -103,7 +103,7 @@ def test_parseFile(self):
6d2a5b2
         href = css_parser.helper.path2url(name)
6d2a5b2
         s = css_parser.parseFile(
6d2a5b2
             name, href=href, media='screen', title='from file')
6d2a5b2
-        self.assertTrue(isinstance(s, css_parser.css.CSSStyleSheet))
6d2a5b2
+        self.assertIsInstance(s, css_parser.css.CSSStyleSheet)
6d2a5b2
         if sys.platform.startswith('java'):
6d2a5b2
             # on Jython only file:
6d2a5b2
             self.assertTrue(s.href.startswith('file:'))
6d2a5b2
@@ -119,7 +119,7 @@ def test_parseFile(self):
6d2a5b2
         ir = s.cssRules[0]
6d2a5b2
         self.assertEqual('import/import2.css', ir.href)
6d2a5b2
         irs = ir.styleSheet
6d2a5b2
-        self.assertTrue(isinstance(irs, css_parser.css.CSSStyleSheet))
6d2a5b2
+        self.assertIsInstance(irs, css_parser.css.CSSStyleSheet)
6d2a5b2
         self.assertEqual(
6d2a5b2
             irs.cssText,
6d2a5b2
             '@import "../import3.css";\n@import "import-impossible.css" print;\n.import2 {\n    /* sheets/import2.css */\n    background: url(http://example.com/images/example.gif);\n    background: url(//example.com/images/example.gif);\n    background: url(/images/example.gif);\n    background: url(images2/example.gif);\n    background: url(./images2/example.gif);\n    background: url(../images/example.gif);\n    background: url(./../images/example.gif)\n    }'  # noqa
6d2a5b2
@@ -131,7 +131,7 @@ def test_parseFile(self):
6d2a5b2
         name = basetest.get_sheet_filename('import.css')
6d2a5b2
 
6d2a5b2
         s = css_parser.parseFile(name, media='screen', title='from file')
6d2a5b2
-        self.assertTrue(isinstance(s, css_parser.css.CSSStyleSheet))
6d2a5b2
+        self.assertIsInstance(s, css_parser.css.CSSStyleSheet)
6d2a5b2
         if sys.platform.startswith('java'):
6d2a5b2
             # on Jython only file:
6d2a5b2
             self.assertTrue(s.href.startswith('file:'))
6d2a5b2
@@ -147,7 +147,7 @@ def test_parseFile(self):
6d2a5b2
         ir = s.cssRules[0]
6d2a5b2
         self.assertEqual('import/import2.css', ir.href)
6d2a5b2
         irs = ir.styleSheet
6d2a5b2
-        self.assertTrue(isinstance(irs, css_parser.css.CSSStyleSheet))
6d2a5b2
+        self.assertIsInstance(irs, css_parser.css.CSSStyleSheet)
6d2a5b2
         self.assertEqual(
6d2a5b2
             irs.cssText,
6d2a5b2
             '@import "../import3.css";\n@import "import-impossible.css" print;\n.import2 {\n    /* sheets/import2.css */\n    background: url(http://example.com/images/example.gif);\n    background: url(//example.com/images/example.gif);\n    background: url(/images/example.gif);\n    background: url(images2/example.gif);\n    background: url(./images2/example.gif);\n    background: url(../images/example.gif);\n    background: url(./../images/example.gif)\n    }'  # noqa
6d2a5b2
@@ -201,7 +201,7 @@ def test_parseUrl(self):
6d2a5b2
         href = css_parser.helper.path2url(href)
6d2a5b2
         # href = 'http://seewhatever.de/sheets/import.css'
6d2a5b2
         s = css_parser.parseUrl(href, media='tv, print', title='from url')
6d2a5b2
-        self.assertTrue(isinstance(s, css_parser.css.CSSStyleSheet))
6d2a5b2
+        self.assertIsInstance(s, css_parser.css.CSSStyleSheet)
6d2a5b2
         self.assertEqual(href, s.href)
6d2a5b2
         self.assertEqual(self.exp.encode(), s.cssText)
6d2a5b2
         self.assertEqual('utf-8', s.encoding)
6d2a5b2
diff --git a/css_parser_tests/test_cssvariablesdeclaration.py b/css_parser_tests/test_cssvariablesdeclaration.py
6d2a5b2
index abe9255..c33f611 100644
6d2a5b2
--- a/css_parser_tests/test_cssvariablesdeclaration.py
6d2a5b2
+++ b/css_parser_tests/test_cssvariablesdeclaration.py
6d2a5b2
@@ -1,350 +1,350 @@
6d2a5b2
-"""Testcases for css_parser.css.cssvariablesdelaration.CSSVariablesDeclaration."""
6d2a5b2
-from __future__ import absolute_import
6d2a5b2
-from __future__ import unicode_literals
6d2a5b2
-__version__ = '$Id: test_cssstyledeclaration.py 1869 2009-10-17 19:37:40Z cthedot $'
6d2a5b2
-
6d2a5b2
-import xml.dom
6d2a5b2
-from . import basetest
6d2a5b2
-import css_parser
6d2a5b2
-
6d2a5b2
-
6d2a5b2
-class CSSVariablesDeclarationTestCase(basetest.BaseTestCase):
6d2a5b2
-
6d2a5b2
-    def setUp(self):
6d2a5b2
-        self.r = css_parser.css.CSSVariablesDeclaration()
6d2a5b2
-        css_parser.ser.prefs.useDefaults()
6d2a5b2
-
6d2a5b2
-    def tearDown(self):
6d2a5b2
-        css_parser.ser.prefs.useDefaults()
6d2a5b2
-
6d2a5b2
-    def test_init(self):
6d2a5b2
-        "CSSVariablesDeclaration.__init__()"
6d2a5b2
-        v = css_parser.css.CSSVariablesDeclaration()
6d2a5b2
-        self.assertEqual('', v.cssText)
6d2a5b2
-        self.assertEqual(0, v.length)
6d2a5b2
-        self.assertEqual(None, v.parentRule)
6d2a5b2
-
6d2a5b2
-        v = css_parser.css.CSSVariablesDeclaration(cssText='x: 0')
6d2a5b2
-        self.assertEqual('x: 0', v.cssText)
6d2a5b2
-        self.assertEqual('0', v.getVariableValue('x'))
6d2a5b2
-
6d2a5b2
-        rule = css_parser.css.CSSVariablesRule()
6d2a5b2
-        v = css_parser.css.CSSVariablesDeclaration(cssText='x: 0',
6d2a5b2
-                                                 parentRule=rule)
6d2a5b2
-        self.assertEqual(rule, v.parentRule)
6d2a5b2
-
6d2a5b2
-    def test__contains__(self):
6d2a5b2
-        "CSSVariablesDeclaration.__contains__(name)"
6d2a5b2
-        v = css_parser.css.CSSVariablesDeclaration(cssText='x: 0; y: 2')
6d2a5b2
-        for test in ('x', 'y'):
6d2a5b2
-            self.assertTrue(test in v)
6d2a5b2
-            self.assertTrue(test.upper() in v)
6d2a5b2
-
6d2a5b2
-        self.assertTrue('z' not in v)
6d2a5b2
-
6d2a5b2
-    def test_items(self):
6d2a5b2
-        "CSSVariablesDeclaration[variableName]"
6d2a5b2
-        v = css_parser.css.CSSVariablesDeclaration()
6d2a5b2
-
6d2a5b2
-        value = '0'
6d2a5b2
-        v['X'] = value
6d2a5b2
-        self.assertEqual(value, v['X'])
6d2a5b2
-        self.assertEqual(value, v.getVariableValue('X'))
6d2a5b2
-        self.assertEqual(value, v['x'])
6d2a5b2
-        self.assertEqual(value, v.getVariableValue('x'))
6d2a5b2
-
6d2a5b2
-        self.assertEqual('', v['y'])
6d2a5b2
-        self.assertEqual('', v.getVariableValue('y'))
6d2a5b2
-
6d2a5b2
-        v['z'] = '1'
6d2a5b2
-        self.assertEqual(2, v.length)
6d2a5b2
-
6d2a5b2
-        items = []
6d2a5b2
-        # unsorted!
6d2a5b2
-        self.assertEqual(sorted(v), ['x', 'z'])
6d2a5b2
-
6d2a5b2
-        del v['z']
6d2a5b2
-        self.assertEqual(1, v.length)
6d2a5b2
-        self.assertEqual(1, v.length)
6d2a5b2
-
6d2a5b2
-        self.assertEqual('0', v.removeVariable('x'))
6d2a5b2
-        self.assertEqual('', v.removeVariable('z'))
6d2a5b2
-        self.assertEqual(0, v.length)
6d2a5b2
-
6d2a5b2
-        v.cssText = 'x:0; y:1'
6d2a5b2
-        keys = []
6d2a5b2
-        # unsorted!
6d2a5b2
-        for i in range(0, v.length):
6d2a5b2
-            keys.append(v.item(i))
6d2a5b2
-        self.assertEqual(sorted(keys), ['x', 'y'])
6d2a5b2
-
6d2a5b2
-    def test_keys(self):
6d2a5b2
-        "CSSVariablesDeclaration.keys()"
6d2a5b2
-        v = css_parser.css.CSSVariablesDeclaration(cssText='x: 0; Y: 2')
6d2a5b2
-        self.assertEqual(['x', 'y'], sorted(v.keys()))
6d2a5b2
-
6d2a5b2
-    def test_cssText(self):
6d2a5b2
-        "CSSVariablesDeclaration.cssText"
6d2a5b2
-        # empty
6d2a5b2
-        tests = {
6d2a5b2
-            '': '',
6d2a5b2
-            ' ': '',
6d2a5b2
-            ' \t \n  ': '',
6d2a5b2
-            'x: 1': None,
6d2a5b2
-            'x: "a"': None,
6d2a5b2
-            'x: rgb(1, 2, 3)': None,
6d2a5b2
-            'x: 1px 2px 3px': None,
6d2a5b2
-
6d2a5b2
-            'x:1': 'x: 1',
6d2a5b2
-            'x:1;': 'x: 1',
6d2a5b2
-
6d2a5b2
-            'x  :  1  ': 'x: 1',
6d2a5b2
-            'x  :  1  ;  ': 'x: 1',
6d2a5b2
-
6d2a5b2
-            'x:1;y:2': 'x: 1;\ny: 2',
6d2a5b2
-            'x:1;y:2;': 'x: 1;\ny: 2',
6d2a5b2
-            'x  :  1  ;  y  :  2  ': 'x: 1;\ny: 2',
6d2a5b2
-            'x  :  1  ;  y  :  2  ;  ': 'x: 1;\ny: 2',
6d2a5b2
-
6d2a5b2
-            '/*x*/': '/*x*/',
6d2a5b2
-            'x555: 5': None,
6d2a5b2
-            'xxx:1;yyy:2': 'xxx: 1;\nyyy: 2',
6d2a5b2
-            'xxx : 1; yyy : 2': 'xxx: 1;\nyyy: 2',
6d2a5b2
-            'x:1;x:2;X:2': 'x: 2',
6d2a5b2
-            'same:1;SAME:2;': 'same: 2',
6d2a5b2
-            '/**/x/**/:/**/1/**/;/**/y/**/:/**/2/**/':
6d2a5b2
-                '/**/\n /**/\n /**/\n x: 1 /**/;\n/**/\n /**/\n /**/\n y: 2 /**/'
6d2a5b2
-        }
6d2a5b2
-        self.do_equal_r(tests)
6d2a5b2
-
6d2a5b2
-    # TODO: Fix?
6d2a5b2
-#    def test_cssText2(self):
6d2a5b2
-#        "CSSVariablesDeclaration.cssText"
6d2a5b2
-#        # exception
6d2a5b2
-#        tests = {
6d2a5b2
-#                 u'top': xml.dom.SyntaxErr,
6d2a5b2
-#                 u'top:': xml.dom.SyntaxErr,
6d2a5b2
-#                 u'top : ': xml.dom.SyntaxErr,
6d2a5b2
-#                 u'top:;': xml.dom.SyntaxErr,
6d2a5b2
-#                 u'top 0': xml.dom.SyntaxErr,
6d2a5b2
-#                 u'top 0;': xml.dom.SyntaxErr,
6d2a5b2
-#
6d2a5b2
-#                 u':': xml.dom.SyntaxErr,
6d2a5b2
-#                 u':0': xml.dom.SyntaxErr,
6d2a5b2
-#                 u':0;': xml.dom.SyntaxErr,
6d2a5b2
-#                 u':;': xml.dom.SyntaxErr,
6d2a5b2
-#                 u': ;': xml.dom.SyntaxErr,
6d2a5b2
-#
6d2a5b2
-#                 u'0': xml.dom.SyntaxErr,
6d2a5b2
-#                 u'0;': xml.dom.SyntaxErr,
6d2a5b2
-#
6d2a5b2
-#                 u';': xml.dom.SyntaxErr,
6d2a5b2
-#            }
6d2a5b2
-#        self.do_raise_r(tests)
6d2a5b2
-
6d2a5b2
-    def test_xVariable(self):
6d2a5b2
-        "CSSVariablesDeclaration.xVariable()"
6d2a5b2
-        v = css_parser.css.CSSVariablesDeclaration()
6d2a5b2
-        # unset
6d2a5b2
-        self.assertEqual('', v.getVariableValue('x'))
6d2a5b2
-        # set
6d2a5b2
-        v.setVariable('x', '0')
6d2a5b2
-        self.assertEqual('0', v.getVariableValue('x'))
6d2a5b2
-        self.assertEqual('0', v.getVariableValue('X'))
6d2a5b2
-        self.assertEqual('x: 0', v.cssText)
6d2a5b2
-        v.setVariable('X', '0')
6d2a5b2
-        self.assertEqual('0', v.getVariableValue('x'))
6d2a5b2
-        self.assertEqual('0', v.getVariableValue('X'))
6d2a5b2
-        self.assertEqual('x: 0', v.cssText)
6d2a5b2
-        # remove
6d2a5b2
-        self.assertEqual('0', v.removeVariable('x'))
6d2a5b2
-        self.assertEqual('', v.removeVariable('x'))
6d2a5b2
-        self.assertEqual('', v.getVariableValue('x'))
6d2a5b2
-        self.assertEqual('', v.cssText)
6d2a5b2
-
6d2a5b2
-    def test_imports(self):
6d2a5b2
-        "CSSVariables imports"
6d2a5b2
-        def fetcher(url):
6d2a5b2
-            url = url.replace('\\', '/')
6d2a5b2
-            url = url[url.rfind('/')+1:]
6d2a5b2
-            return (None, {
6d2a5b2
-                '3.css': '''
6d2a5b2
-                    @variables {
6d2a5b2
-                        over3-2-1-0: 3;
6d2a5b2
-                        over3-2-1: 3;
6d2a5b2
-                        over3-2: 3;
6d2a5b2
-                        over3-2-0: 3;
6d2a5b2
-                        over3-1: 3;
6d2a5b2
-                        over3-1-0: 3;
6d2a5b2
-                        over3-0: 3;
6d2a5b2
-                        local3: 3;
6d2a5b2
-                    }
6d2a5b2
-                
6d2a5b2
-                ''',
6d2a5b2
-                '2.css': '''
6d2a5b2
-                    @variables {
6d2a5b2
-                        over3-2-1-0: 2;
6d2a5b2
-                        over3-2-1: 2;
6d2a5b2
-                        over3-2-0: 2;
6d2a5b2
-                        over3-2: 2;
6d2a5b2
-                        over2-1: 2;
6d2a5b2
-                        over2-1-0: 2;
6d2a5b2
-                        over2-0: 2;
6d2a5b2
-                        local2: 2;
6d2a5b2
-                    }
6d2a5b2
-                
6d2a5b2
-                ''',
6d2a5b2
-                '1.css': '''
6d2a5b2
-                    @import "3.css";
6d2a5b2
-                    @import "2.css";
6d2a5b2
-                    @variables {
6d2a5b2
-                        over3-2-1-0: 1;
6d2a5b2
-                        over3-2-1: 1;
6d2a5b2
-                        over3-1: 1;
6d2a5b2
-                        over3-1-0: 1;
6d2a5b2
-                        over2-1: 1;
6d2a5b2
-                        over2-1-0: 1;
6d2a5b2
-                        over1-0: 1;
6d2a5b2
-                        local1: 1;
6d2a5b2
-                    }
6d2a5b2
-                
6d2a5b2
-                '''
6d2a5b2
-            }[url])
6d2a5b2
-
6d2a5b2
-        css = '''
6d2a5b2
-            @import "1.css";
6d2a5b2
-            @variables {
6d2a5b2
-                over3-2-1-0: 0;
6d2a5b2
-                over3-2-0: 0;
6d2a5b2
-                over3-1-0: 0;
6d2a5b2
-                over2-1-0: 0;
6d2a5b2
-                over3-0: 0;
6d2a5b2
-                over2-0: 0;
6d2a5b2
-                over1-0: 0;
6d2a5b2
-                local0: 0;
6d2a5b2
-            }
6d2a5b2
-            a {
6d2a5b2
-                local0: var(local0);
6d2a5b2
-                local1: var(local1);
6d2a5b2
-                local2: var(local2);
6d2a5b2
-                local3: var(local3);
6d2a5b2
-                over1-0: var(over1-0);
6d2a5b2
-                over2-0: var(over2-0);
6d2a5b2
-                over3-0: var(over3-0);
6d2a5b2
-                over2-1: var(over2-1);
6d2a5b2
-                over3-1: var(over3-1);
6d2a5b2
-                over3-2: var(over3-2);
6d2a5b2
-                over2-1-0: var(over2-1-0);
6d2a5b2
-                over3-2-0: var(over3-2-0);
6d2a5b2
-                over3-2-1: var(over3-2-1);
6d2a5b2
-                over3-2-1-0: var(over3-2-1-0);
6d2a5b2
-            }
6d2a5b2
-        '''
6d2a5b2
-        p = css_parser.CSSParser(fetcher=fetcher)
6d2a5b2
-        s = p.parseString(css)
6d2a5b2
-
6d2a5b2
-        # only these in rule of this sheet
6d2a5b2
-        self.assertEqual(s.cssRules[1].variables.length, 8)
6d2a5b2
-        # but all vars in s available!
6d2a5b2
-        self.assertEqual(s.variables.length, 15)
6d2a5b2
-        self.assertEqual(['local0', 'local1', 'local2', 'local3',
6d2a5b2
-                          'over1-0', 'over2-0', 'over2-1', 'over2-1-0',
6d2a5b2
-                          'over3-0', 'over3-1', 'over3-1-0', 'over3-2',
6d2a5b2
-                          'over3-2-0', 'over3-2-1', 'over3-2-1-0'],
6d2a5b2
-                         sorted(s.variables.keys()))
6d2a5b2
-
6d2a5b2
-        # test with variables rule
6d2a5b2
-        css_parser.ser.prefs.resolveVariables = False
6d2a5b2
-        self.assertEqual(s.cssText, '''@import "1.css";
6d2a5b2
-@variables {
6d2a5b2
-    over3-2-1-0: 0;
6d2a5b2
-    over3-2-0: 0;
6d2a5b2
-    over3-1-0: 0;
6d2a5b2
-    over2-1-0: 0;
6d2a5b2
-    over3-0: 0;
6d2a5b2
-    over2-0: 0;
6d2a5b2
-    over1-0: 0;
6d2a5b2
-    local0: 0
6d2a5b2
-    }
6d2a5b2
-a {
6d2a5b2
-    local0: var(local0);
6d2a5b2
-    local1: var(local1);
6d2a5b2
-    local2: var(local2);
6d2a5b2
-    local3: var(local3);
6d2a5b2
-    over1-0: var(over1-0);
6d2a5b2
-    over2-0: var(over2-0);
6d2a5b2
-    over3-0: var(over3-0);
6d2a5b2
-    over2-1: var(over2-1);
6d2a5b2
-    over3-1: var(over3-1);
6d2a5b2
-    over3-2: var(over3-2);
6d2a5b2
-    over2-1-0: var(over2-1-0);
6d2a5b2
-    over3-2-0: var(over3-2-0);
6d2a5b2
-    over3-2-1: var(over3-2-1);
6d2a5b2
-    over3-2-1-0: var(over3-2-1-0)
6d2a5b2
-    }'''.encode())
6d2a5b2
-
6d2a5b2
-        # test with resolved vars
6d2a5b2
-        css_parser.ser.prefs.resolveVariables = True
6d2a5b2
-        self.assertEqual(s.cssText, '''@import "1.css";
6d2a5b2
-a {
6d2a5b2
-    local0: 0;
6d2a5b2
-    local1: 1;
6d2a5b2
-    local2: 2;
6d2a5b2
-    local3: 3;
6d2a5b2
-    over1-0: 0;
6d2a5b2
-    over2-0: 0;
6d2a5b2
-    over3-0: 0;
6d2a5b2
-    over2-1: 1;
6d2a5b2
-    over3-1: 1;
6d2a5b2
-    over3-2: 2;
6d2a5b2
-    over2-1-0: 0;
6d2a5b2
-    over3-2-0: 0;
6d2a5b2
-    over3-2-1: 1;
6d2a5b2
-    over3-2-1-0: 0
6d2a5b2
-    }'''.encode())
6d2a5b2
-
6d2a5b2
-        s = css_parser.resolveImports(s)
6d2a5b2
-        self.assertEqual(s.cssText, '''/* START @import "1.css" */
6d2a5b2
-/* START @import "3.css" */
6d2a5b2
-/* START @import "2.css" */
6d2a5b2
-a {
6d2a5b2
-    local0: 0;
6d2a5b2
-    local1: 1;
6d2a5b2
-    local2: 2;
6d2a5b2
-    local3: 3;
6d2a5b2
-    over1-0: 0;
6d2a5b2
-    over2-0: 0;
6d2a5b2
-    over3-0: 0;
6d2a5b2
-    over2-1: 1;
6d2a5b2
-    over3-1: 1;
6d2a5b2
-    over3-2: 2;
6d2a5b2
-    over2-1-0: 0;
6d2a5b2
-    over3-2-0: 0;
6d2a5b2
-    over3-2-1: 1;
6d2a5b2
-    over3-2-1-0: 0
6d2a5b2
-    }'''.encode())
6d2a5b2
-
6d2a5b2
-    def test_parentRule(self):
6d2a5b2
-        "CSSVariablesDeclaration.parentRule"
6d2a5b2
-        s = css_parser.parseString('@variables { a:1}')
6d2a5b2
-        r = s.cssRules[0]
6d2a5b2
-        d = r.variables
6d2a5b2
-        self.assertEqual(r, d.parentRule)
6d2a5b2
-
6d2a5b2
-        d2 = css_parser.css.CSSVariablesDeclaration('b: 2')
6d2a5b2
-        r.variables = d2
6d2a5b2
-        self.assertEqual(r, d2.parentRule)
6d2a5b2
-
6d2a5b2
-    def test_reprANDstr(self):
6d2a5b2
-        "CSSVariablesDeclaration.__repr__(), .__str__()"
6d2a5b2
-        s = css_parser.css.CSSVariablesDeclaration(cssText='a:1;b:2')
6d2a5b2
-
6d2a5b2
-        self.assertTrue("2" in str(s))  # length
6d2a5b2
-
6d2a5b2
-        s2 = eval(repr(s))
6d2a5b2
-        self.assertTrue(isinstance(s2, s.__class__))
6d2a5b2
-
6d2a5b2
-
6d2a5b2
-if __name__ == '__main__':
6d2a5b2
-    import unittest
6d2a5b2
-    unittest.main()
6d2a5b2
+"""Testcases for css_parser.css.cssvariablesdelaration.CSSVariablesDeclaration."""
6d2a5b2
+from __future__ import absolute_import
6d2a5b2
+from __future__ import unicode_literals
6d2a5b2
+__version__ = '$Id: test_cssstyledeclaration.py 1869 2009-10-17 19:37:40Z cthedot $'
6d2a5b2
+
6d2a5b2
+import xml.dom
6d2a5b2
+from . import basetest
6d2a5b2
+import css_parser
6d2a5b2
+
6d2a5b2
+
6d2a5b2
+class CSSVariablesDeclarationTestCase(basetest.BaseTestCase):
6d2a5b2
+
6d2a5b2
+    def setUp(self):
6d2a5b2
+        self.r = css_parser.css.CSSVariablesDeclaration()
6d2a5b2
+        css_parser.ser.prefs.useDefaults()
6d2a5b2
+
6d2a5b2
+    def tearDown(self):
6d2a5b2
+        css_parser.ser.prefs.useDefaults()
6d2a5b2
+
6d2a5b2
+    def test_init(self):
6d2a5b2
+        "CSSVariablesDeclaration.__init__()"
6d2a5b2
+        v = css_parser.css.CSSVariablesDeclaration()
6d2a5b2
+        self.assertEqual('', v.cssText)
6d2a5b2
+        self.assertEqual(0, v.length)
6d2a5b2
+        self.assertEqual(None, v.parentRule)
6d2a5b2
+
6d2a5b2
+        v = css_parser.css.CSSVariablesDeclaration(cssText='x: 0')
6d2a5b2
+        self.assertEqual('x: 0', v.cssText)
6d2a5b2
+        self.assertEqual('0', v.getVariableValue('x'))
6d2a5b2
+
6d2a5b2
+        rule = css_parser.css.CSSVariablesRule()
6d2a5b2
+        v = css_parser.css.CSSVariablesDeclaration(cssText='x: 0',
6d2a5b2
+                                                 parentRule=rule)
6d2a5b2
+        self.assertEqual(rule, v.parentRule)
6d2a5b2
+
6d2a5b2
+    def test__contains__(self):
6d2a5b2
+        "CSSVariablesDeclaration.__contains__(name)"
6d2a5b2
+        v = css_parser.css.CSSVariablesDeclaration(cssText='x: 0; y: 2')
6d2a5b2
+        for test in ('x', 'y'):
6d2a5b2
+            self.assertIn(test, v)
6d2a5b2
+            self.assertIn(test.upper(), v)
6d2a5b2
+
6d2a5b2
+        self.assertNotIn('z', v)
6d2a5b2
+
6d2a5b2
+    def test_items(self):
6d2a5b2
+        "CSSVariablesDeclaration[variableName]"
6d2a5b2
+        v = css_parser.css.CSSVariablesDeclaration()
6d2a5b2
+
6d2a5b2
+        value = '0'
6d2a5b2
+        v['X'] = value
6d2a5b2
+        self.assertEqual(value, v['X'])
6d2a5b2
+        self.assertEqual(value, v.getVariableValue('X'))
6d2a5b2
+        self.assertEqual(value, v['x'])
6d2a5b2
+        self.assertEqual(value, v.getVariableValue('x'))
6d2a5b2
+
6d2a5b2
+        self.assertEqual('', v['y'])
6d2a5b2
+        self.assertEqual('', v.getVariableValue('y'))
6d2a5b2
+
6d2a5b2
+        v['z'] = '1'
6d2a5b2
+        self.assertEqual(2, v.length)
6d2a5b2
+
6d2a5b2
+        items = []
6d2a5b2
+        # unsorted!
6d2a5b2
+        self.assertEqual(sorted(v), ['x', 'z'])
6d2a5b2
+
6d2a5b2
+        del v['z']
6d2a5b2
+        self.assertEqual(1, v.length)
6d2a5b2
+        self.assertEqual(1, v.length)
6d2a5b2
+
6d2a5b2
+        self.assertEqual('0', v.removeVariable('x'))
6d2a5b2
+        self.assertEqual('', v.removeVariable('z'))
6d2a5b2
+        self.assertEqual(0, v.length)
6d2a5b2
+
6d2a5b2
+        v.cssText = 'x:0; y:1'
6d2a5b2
+        keys = []
6d2a5b2
+        # unsorted!
6d2a5b2
+        for i in range(0, v.length):
6d2a5b2
+            keys.append(v.item(i))
6d2a5b2
+        self.assertEqual(sorted(keys), ['x', 'y'])
6d2a5b2
+
6d2a5b2
+    def test_keys(self):
6d2a5b2
+        "CSSVariablesDeclaration.keys()"
6d2a5b2
+        v = css_parser.css.CSSVariablesDeclaration(cssText='x: 0; Y: 2')
6d2a5b2
+        self.assertEqual(['x', 'y'], sorted(v.keys()))
6d2a5b2
+
6d2a5b2
+    def test_cssText(self):
6d2a5b2
+        "CSSVariablesDeclaration.cssText"
6d2a5b2
+        # empty
6d2a5b2
+        tests = {
6d2a5b2
+            '': '',
6d2a5b2
+            ' ': '',
6d2a5b2
+            ' \t \n  ': '',
6d2a5b2
+            'x: 1': None,
6d2a5b2
+            'x: "a"': None,
6d2a5b2
+            'x: rgb(1, 2, 3)': None,
6d2a5b2
+            'x: 1px 2px 3px': None,
6d2a5b2
+
6d2a5b2
+            'x:1': 'x: 1',
6d2a5b2
+            'x:1;': 'x: 1',
6d2a5b2
+
6d2a5b2
+            'x  :  1  ': 'x: 1',
6d2a5b2
+            'x  :  1  ;  ': 'x: 1',
6d2a5b2
+
6d2a5b2
+            'x:1;y:2': 'x: 1;\ny: 2',
6d2a5b2
+            'x:1;y:2;': 'x: 1;\ny: 2',
6d2a5b2
+            'x  :  1  ;  y  :  2  ': 'x: 1;\ny: 2',
6d2a5b2
+            'x  :  1  ;  y  :  2  ;  ': 'x: 1;\ny: 2',
6d2a5b2
+
6d2a5b2
+            '/*x*/': '/*x*/',
6d2a5b2
+            'x555: 5': None,
6d2a5b2
+            'xxx:1;yyy:2': 'xxx: 1;\nyyy: 2',
6d2a5b2
+            'xxx : 1; yyy : 2': 'xxx: 1;\nyyy: 2',
6d2a5b2
+            'x:1;x:2;X:2': 'x: 2',
6d2a5b2
+            'same:1;SAME:2;': 'same: 2',
6d2a5b2
+            '/**/x/**/:/**/1/**/;/**/y/**/:/**/2/**/':
6d2a5b2
+                '/**/\n /**/\n /**/\n x: 1 /**/;\n/**/\n /**/\n /**/\n y: 2 /**/'
6d2a5b2
+        }
6d2a5b2
+        self.do_equal_r(tests)
6d2a5b2
+
6d2a5b2
+    # TODO: Fix?
6d2a5b2
+#    def test_cssText2(self):
6d2a5b2
+#        "CSSVariablesDeclaration.cssText"
6d2a5b2
+#        # exception
6d2a5b2
+#        tests = {
6d2a5b2
+#                 u'top': xml.dom.SyntaxErr,
6d2a5b2
+#                 u'top:': xml.dom.SyntaxErr,
6d2a5b2
+#                 u'top : ': xml.dom.SyntaxErr,
6d2a5b2
+#                 u'top:;': xml.dom.SyntaxErr,
6d2a5b2
+#                 u'top 0': xml.dom.SyntaxErr,
6d2a5b2
+#                 u'top 0;': xml.dom.SyntaxErr,
6d2a5b2
+#
6d2a5b2
+#                 u':': xml.dom.SyntaxErr,
6d2a5b2
+#                 u':0': xml.dom.SyntaxErr,
6d2a5b2
+#                 u':0;': xml.dom.SyntaxErr,
6d2a5b2
+#                 u':;': xml.dom.SyntaxErr,
6d2a5b2
+#                 u': ;': xml.dom.SyntaxErr,
6d2a5b2
+#
6d2a5b2
+#                 u'0': xml.dom.SyntaxErr,
6d2a5b2
+#                 u'0;': xml.dom.SyntaxErr,
6d2a5b2
+#
6d2a5b2
+#                 u';': xml.dom.SyntaxErr,
6d2a5b2
+#            }
6d2a5b2
+#        self.do_raise_r(tests)
6d2a5b2
+
6d2a5b2
+    def test_xVariable(self):
6d2a5b2
+        "CSSVariablesDeclaration.xVariable()"
6d2a5b2
+        v = css_parser.css.CSSVariablesDeclaration()
6d2a5b2
+        # unset
6d2a5b2
+        self.assertEqual('', v.getVariableValue('x'))
6d2a5b2
+        # set
6d2a5b2
+        v.setVariable('x', '0')
6d2a5b2
+        self.assertEqual('0', v.getVariableValue('x'))
6d2a5b2
+        self.assertEqual('0', v.getVariableValue('X'))
6d2a5b2
+        self.assertEqual('x: 0', v.cssText)
6d2a5b2
+        v.setVariable('X', '0')
6d2a5b2
+        self.assertEqual('0', v.getVariableValue('x'))
6d2a5b2
+        self.assertEqual('0', v.getVariableValue('X'))
6d2a5b2
+        self.assertEqual('x: 0', v.cssText)
6d2a5b2
+        # remove
6d2a5b2
+        self.assertEqual('0', v.removeVariable('x'))
6d2a5b2
+        self.assertEqual('', v.removeVariable('x'))
6d2a5b2
+        self.assertEqual('', v.getVariableValue('x'))
6d2a5b2
+        self.assertEqual('', v.cssText)
6d2a5b2
+
6d2a5b2
+    def test_imports(self):
6d2a5b2
+        "CSSVariables imports"
6d2a5b2
+        def fetcher(url):
6d2a5b2
+            url = url.replace('\\', '/')
6d2a5b2
+            url = url[url.rfind('/')+1:]
6d2a5b2
+            return (None, {
6d2a5b2
+                '3.css': '''
6d2a5b2
+                    @variables {
6d2a5b2
+                        over3-2-1-0: 3;
6d2a5b2
+                        over3-2-1: 3;
6d2a5b2
+                        over3-2: 3;
6d2a5b2
+                        over3-2-0: 3;
6d2a5b2
+                        over3-1: 3;
6d2a5b2
+                        over3-1-0: 3;
6d2a5b2
+                        over3-0: 3;
6d2a5b2
+                        local3: 3;
6d2a5b2
+                    }
6d2a5b2
+                
6d2a5b2
+                ''',
6d2a5b2
+                '2.css': '''
6d2a5b2
+                    @variables {
6d2a5b2
+                        over3-2-1-0: 2;
6d2a5b2
+                        over3-2-1: 2;
6d2a5b2
+                        over3-2-0: 2;
6d2a5b2
+                        over3-2: 2;
6d2a5b2
+                        over2-1: 2;
6d2a5b2
+                        over2-1-0: 2;
6d2a5b2
+                        over2-0: 2;
6d2a5b2
+                        local2: 2;
6d2a5b2
+                    }
6d2a5b2
+                
6d2a5b2
+                ''',
6d2a5b2
+                '1.css': '''
6d2a5b2
+                    @import "3.css";
6d2a5b2
+                    @import "2.css";
6d2a5b2
+                    @variables {
6d2a5b2
+                        over3-2-1-0: 1;
6d2a5b2
+                        over3-2-1: 1;
6d2a5b2
+                        over3-1: 1;
6d2a5b2
+                        over3-1-0: 1;
6d2a5b2
+                        over2-1: 1;
6d2a5b2
+                        over2-1-0: 1;
6d2a5b2
+                        over1-0: 1;
6d2a5b2
+                        local1: 1;
6d2a5b2
+                    }
6d2a5b2
+                
6d2a5b2
+                '''
6d2a5b2
+            }[url])
6d2a5b2
+
6d2a5b2
+        css = '''
6d2a5b2
+            @import "1.css";
6d2a5b2
+            @variables {
6d2a5b2
+                over3-2-1-0: 0;
6d2a5b2
+                over3-2-0: 0;
6d2a5b2
+                over3-1-0: 0;
6d2a5b2
+                over2-1-0: 0;
6d2a5b2
+                over3-0: 0;
6d2a5b2
+                over2-0: 0;
6d2a5b2
+                over1-0: 0;
6d2a5b2
+                local0: 0;
6d2a5b2
+            }
6d2a5b2
+            a {
6d2a5b2
+                local0: var(local0);
6d2a5b2
+                local1: var(local1);
6d2a5b2
+                local2: var(local2);
6d2a5b2
+                local3: var(local3);
6d2a5b2
+                over1-0: var(over1-0);
6d2a5b2
+                over2-0: var(over2-0);
6d2a5b2
+                over3-0: var(over3-0);
6d2a5b2
+                over2-1: var(over2-1);
6d2a5b2
+                over3-1: var(over3-1);
6d2a5b2
+                over3-2: var(over3-2);
6d2a5b2
+                over2-1-0: var(over2-1-0);
6d2a5b2
+                over3-2-0: var(over3-2-0);
6d2a5b2
+                over3-2-1: var(over3-2-1);
6d2a5b2
+                over3-2-1-0: var(over3-2-1-0);
6d2a5b2
+            }
6d2a5b2
+        '''
6d2a5b2
+        p = css_parser.CSSParser(fetcher=fetcher)
6d2a5b2
+        s = p.parseString(css)
6d2a5b2
+
6d2a5b2
+        # only these in rule of this sheet
6d2a5b2
+        self.assertEqual(s.cssRules[1].variables.length, 8)
6d2a5b2
+        # but all vars in s available!
6d2a5b2
+        self.assertEqual(s.variables.length, 15)
6d2a5b2
+        self.assertEqual(['local0', 'local1', 'local2', 'local3',
6d2a5b2
+                          'over1-0', 'over2-0', 'over2-1', 'over2-1-0',
6d2a5b2
+                          'over3-0', 'over3-1', 'over3-1-0', 'over3-2',
6d2a5b2
+                          'over3-2-0', 'over3-2-1', 'over3-2-1-0'],
6d2a5b2
+                         sorted(s.variables.keys()))
6d2a5b2
+
6d2a5b2
+        # test with variables rule
6d2a5b2
+        css_parser.ser.prefs.resolveVariables = False
6d2a5b2
+        self.assertEqual(s.cssText, '''@import "1.css";
6d2a5b2
+@variables {
6d2a5b2
+    over3-2-1-0: 0;
6d2a5b2
+    over3-2-0: 0;
6d2a5b2
+    over3-1-0: 0;
6d2a5b2
+    over2-1-0: 0;
6d2a5b2
+    over3-0: 0;
6d2a5b2
+    over2-0: 0;
6d2a5b2
+    over1-0: 0;
6d2a5b2
+    local0: 0
6d2a5b2
+    }
6d2a5b2
+a {
6d2a5b2
+    local0: var(local0);
6d2a5b2
+    local1: var(local1);
6d2a5b2
+    local2: var(local2);
6d2a5b2
+    local3: var(local3);
6d2a5b2
+    over1-0: var(over1-0);
6d2a5b2
+    over2-0: var(over2-0);
6d2a5b2
+    over3-0: var(over3-0);
6d2a5b2
+    over2-1: var(over2-1);
6d2a5b2
+    over3-1: var(over3-1);
6d2a5b2
+    over3-2: var(over3-2);
6d2a5b2
+    over2-1-0: var(over2-1-0);
6d2a5b2
+    over3-2-0: var(over3-2-0);
6d2a5b2
+    over3-2-1: var(over3-2-1);
6d2a5b2
+    over3-2-1-0: var(over3-2-1-0)
6d2a5b2
+    }'''.encode())
6d2a5b2
+
6d2a5b2
+        # test with resolved vars
6d2a5b2
+        css_parser.ser.prefs.resolveVariables = True
6d2a5b2
+        self.assertEqual(s.cssText, '''@import "1.css";
6d2a5b2
+a {
6d2a5b2
+    local0: 0;
6d2a5b2
+    local1: 1;
6d2a5b2
+    local2: 2;
6d2a5b2
+    local3: 3;
6d2a5b2
+    over1-0: 0;
6d2a5b2
+    over2-0: 0;
6d2a5b2
+    over3-0: 0;
6d2a5b2
+    over2-1: 1;
6d2a5b2
+    over3-1: 1;
6d2a5b2
+    over3-2: 2;
6d2a5b2
+    over2-1-0: 0;
6d2a5b2
+    over3-2-0: 0;
6d2a5b2
+    over3-2-1: 1;
6d2a5b2
+    over3-2-1-0: 0
6d2a5b2
+    }'''.encode())
6d2a5b2
+
6d2a5b2
+        s = css_parser.resolveImports(s)
6d2a5b2
+        self.assertEqual(s.cssText, '''/* START @import "1.css" */
6d2a5b2
+/* START @import "3.css" */
6d2a5b2
+/* START @import "2.css" */
6d2a5b2
+a {
6d2a5b2
+    local0: 0;
6d2a5b2
+    local1: 1;
6d2a5b2
+    local2: 2;
6d2a5b2
+    local3: 3;
6d2a5b2
+    over1-0: 0;
6d2a5b2
+    over2-0: 0;
6d2a5b2
+    over3-0: 0;
6d2a5b2
+    over2-1: 1;
6d2a5b2
+    over3-1: 1;
6d2a5b2
+    over3-2: 2;
6d2a5b2
+    over2-1-0: 0;
6d2a5b2
+    over3-2-0: 0;
6d2a5b2
+    over3-2-1: 1;
6d2a5b2
+    over3-2-1-0: 0
6d2a5b2
+    }'''.encode())
6d2a5b2
+
6d2a5b2
+    def test_parentRule(self):
6d2a5b2
+        "CSSVariablesDeclaration.parentRule"
6d2a5b2
+        s = css_parser.parseString('@variables { a:1}')
6d2a5b2
+        r = s.cssRules[0]
6d2a5b2
+        d = r.variables
6d2a5b2
+        self.assertEqual(r, d.parentRule)
6d2a5b2
+
6d2a5b2
+        d2 = css_parser.css.CSSVariablesDeclaration('b: 2')
6d2a5b2
+        r.variables = d2
6d2a5b2
+        self.assertEqual(r, d2.parentRule)
6d2a5b2
+
6d2a5b2
+    def test_reprANDstr(self):
6d2a5b2
+        "CSSVariablesDeclaration.__repr__(), .__str__()"
6d2a5b2
+        s = css_parser.css.CSSVariablesDeclaration(cssText='a:1;b:2')
6d2a5b2
+
6d2a5b2
+        self.assertIn('2', str(s)) # length
6d2a5b2
+
6d2a5b2
+        s2 = eval(repr(s))
6d2a5b2
+        self.assertIsInstance(s2, s.__class__)
6d2a5b2
+
6d2a5b2
+
6d2a5b2
+if __name__ == '__main__':
6d2a5b2
+    import unittest
6d2a5b2
+    unittest.main()
6d2a5b2
diff --git a/css_parser_tests/test_cssvariablesrule.py b/css_parser_tests/test_cssvariablesrule.py
6d2a5b2
index 5390cb1..ed50436 100644
6d2a5b2
--- a/css_parser_tests/test_cssvariablesrule.py
6d2a5b2
+++ b/css_parser_tests/test_cssvariablesrule.py
6d2a5b2
@@ -1,157 +1,157 @@
6d2a5b2
-"""Testcases for css_parser.css.CSSPageRule"""
6d2a5b2
+"""Testcases for css_parser.css.CSSPageRule"""
6d2a5b2
 from __future__ import absolute_import
6d2a5b2
 from __future__ import unicode_literals
6d2a5b2
-__version__ = '$Id: test_csspagerule.py 1869 2009-10-17 19:37:40Z cthedot $'
6d2a5b2
-
6d2a5b2
-import xml.dom
6d2a5b2
-from . import test_cssrule
6d2a5b2
-import css_parser
6d2a5b2
-
6d2a5b2
-
6d2a5b2
-class CSSVariablesRuleTestCase(test_cssrule.CSSRuleTestCase):
6d2a5b2
-
6d2a5b2
-    def setUp(self):
6d2a5b2
-        super(CSSVariablesRuleTestCase, self).setUp()
6d2a5b2
-        self.r = css_parser.css.CSSVariablesRule()
6d2a5b2
-        self.rRO = css_parser.css.CSSVariablesRule(readonly=True)
6d2a5b2
-        self.r_type = css_parser.css.CSSPageRule.VARIABLES_RULE
6d2a5b2
-        self.r_typeString = 'VARIABLES_RULE'
6d2a5b2
-
6d2a5b2
-        css_parser.ser.prefs.resolveVariables = False
6d2a5b2
-
6d2a5b2
-    def test_init(self):
6d2a5b2
-        "CSSVariablesRule.__init__()"
6d2a5b2
-        super(CSSVariablesRuleTestCase, self).test_init()
6d2a5b2
-
6d2a5b2
-        r = css_parser.css.CSSVariablesRule()
6d2a5b2
-        self.assertEqual(css_parser.css.CSSVariablesDeclaration,
6d2a5b2
-                         type(r.variables))
6d2a5b2
-        self.assertEqual(r, r.variables.parentRule)
6d2a5b2
-
6d2a5b2
-        # until any variables
6d2a5b2
-        self.assertEqual('', r.cssText)
6d2a5b2
-
6d2a5b2
-        # only possible to set @... similar name
6d2a5b2
-        self.assertRaises(xml.dom.InvalidModificationErr,
6d2a5b2
-                          self.r._setAtkeyword, 'x')
6d2a5b2
-
6d2a5b2
-    def test_InvalidModificationErr(self):
6d2a5b2
-        "CSSVariablesRule.cssText InvalidModificationErr"
6d2a5b2
-        self._test_InvalidModificationErr('@variables')
6d2a5b2
-        tests = {
6d2a5b2
-            '@var {}': xml.dom.InvalidModificationErr,
6d2a5b2
-        }
6d2a5b2
-        self.do_raise_r(tests)
6d2a5b2
-
6d2a5b2
-    def test_incomplete(self):
6d2a5b2
-        "CSSVariablesRule (incomplete)"
6d2a5b2
-        tests = {
6d2a5b2
-            '@variables { ':
6d2a5b2
-                '',  # no } and no content
6d2a5b2
-            '@variables { x: red':
6d2a5b2
-                '@variables {\n    x: red\n    }',  # no }
6d2a5b2
-        }
6d2a5b2
-        self.do_equal_p(tests)  # parse
6d2a5b2
-
6d2a5b2
-    def test_cssText(self):
6d2a5b2
-        "CSSVariablesRule"
6d2a5b2
-        EXP = '@variables {\n    margin: 0\n    }'
6d2a5b2
-        tests = {
6d2a5b2
-            '@variables {}': '',
6d2a5b2
-            '@variables     {margin:0;}': EXP,
6d2a5b2
-            '@variables     {margin:0}': EXP,
6d2a5b2
-            '@VaRIables {   margin    :   0   ;    }': EXP,
6d2a5b2
-            '@\\VaRIables {    margin : 0    }': EXP,
6d2a5b2
-
6d2a5b2
-            '@variables {a:1;b:2}':
6d2a5b2
-                '@variables {\n    a: 1;\n    b: 2\n    }',
6d2a5b2
-
6d2a5b2
-            # comments
6d2a5b2
-            '@variables   /*1*/   {margin:0;}':
6d2a5b2
-                '@variables /*1*/ {\n    margin: 0\n    }',
6d2a5b2
-            '@variables/*1*/{margin:0;}':
6d2a5b2
-                '@variables /*1*/ {\n    margin: 0\n    }',
6d2a5b2
-        }
6d2a5b2
-        self.do_equal_r(tests)
6d2a5b2
-        self.do_equal_p(tests)
6d2a5b2
-
6d2a5b2
-    def test_media(self):
6d2a5b2
-        "CSSVariablesRule.media"
6d2a5b2
-        r = css_parser.css.CSSVariablesRule()
6d2a5b2
-        self.assertRaises(AttributeError, r.__getattribute__, 'media')
6d2a5b2
-        self.assertRaises(AttributeError, r.__setattr__, 'media', '?')
6d2a5b2
-
6d2a5b2
-    def test_variables(self):
6d2a5b2
-        "CSSVariablesRule.variables"
6d2a5b2
-        r = css_parser.css.CSSVariablesRule(
6d2a5b2
-            variables=css_parser.css.CSSVariablesDeclaration('x: 1'))
6d2a5b2
-        self.assertEqual(r, r.variables.parentRule)
6d2a5b2
-
6d2a5b2
-        # cssText
6d2a5b2
-        r = css_parser.css.CSSVariablesRule()
6d2a5b2
-        r.cssText = '@variables { x: 1 }'
6d2a5b2
-        vars1 = r.variables
6d2a5b2
-        self.assertEqual(r, r.variables.parentRule)
6d2a5b2
-        self.assertEqual(vars1, r.variables)
6d2a5b2
-        self.assertEqual(r.variables.cssText, 'x: 1')
6d2a5b2
-        self.assertEqual(r.cssText, '@variables {\n    x: 1\n    }')
6d2a5b2
-
6d2a5b2
-        r.cssText = '@variables {y:2}'
6d2a5b2
-        self.assertEqual(r, r.variables.parentRule)
6d2a5b2
-        self.assertNotEqual(vars1, r.variables)
6d2a5b2
-        self.assertEqual(r.variables.cssText, 'y: 2')
6d2a5b2
-        self.assertEqual(r.cssText, '@variables {\n    y: 2\n    }')
6d2a5b2
-
6d2a5b2
-        vars2 = r.variables
6d2a5b2
-
6d2a5b2
-        # fail
6d2a5b2
-        try:
6d2a5b2
-            r.cssText = '@variables {$:1}'
6d2a5b2
-        except xml.dom.DOMException as e:
6d2a5b2
-            pass
6d2a5b2
-
6d2a5b2
-        self.assertEqual(vars2, r.variables)
6d2a5b2
-        self.assertEqual(r.variables.cssText, 'y: 2')
6d2a5b2
-        self.assertEqual(r.cssText, '@variables {\n    y: 2\n    }')
6d2a5b2
-
6d2a5b2
-        # var decl
6d2a5b2
-        vars3 = css_parser.css.CSSVariablesDeclaration('z: 3')
6d2a5b2
-        r.variables = vars3
6d2a5b2
-
6d2a5b2
-        self.assertEqual(r, r.variables.parentRule)
6d2a5b2
-        self.assertEqual(vars3, r.variables)
6d2a5b2
-        self.assertEqual(r.variables.cssText, 'z: 3')
6d2a5b2
-        self.assertEqual(r.cssText, '@variables {\n    z: 3\n    }')
6d2a5b2
-
6d2a5b2
-        # string
6d2a5b2
-        r.variables = 'a: x'
6d2a5b2
-        self.assertNotEqual(vars3, r.variables)
6d2a5b2
-        self.assertEqual(r, r.variables.parentRule)
6d2a5b2
-        self.assertEqual(r.variables.cssText, 'a: x')
6d2a5b2
-        self.assertEqual(r.cssText, '@variables {\n    a: x\n    }')
6d2a5b2
-        vars4 = r.variables
6d2a5b2
-
6d2a5b2
-        # string fail
6d2a5b2
-        try:
6d2a5b2
-            r.variables = '$: x'
6d2a5b2
-        except xml.dom.DOMException as e:
6d2a5b2
-            pass
6d2a5b2
-        self.assertEqual(vars4, r.variables)
6d2a5b2
-        self.assertEqual(r, r.variables.parentRule)
6d2a5b2
-        self.assertEqual(r.variables.cssText, 'a: x')
6d2a5b2
-        self.assertEqual(r.cssText, '@variables {\n    a: x\n    }')
6d2a5b2
-
6d2a5b2
-    def test_reprANDstr(self):
6d2a5b2
-        "CSSVariablesRule.__repr__(), .__str__()"
6d2a5b2
-        r = css_parser.css.CSSVariablesRule()
6d2a5b2
-        r.cssText = '@variables { xxx: 1 }'
6d2a5b2
-        self.assertTrue('xxx' in str(r))
6d2a5b2
-
6d2a5b2
-        r2 = eval(repr(r))
6d2a5b2
-        self.assertTrue(isinstance(r2, r.__class__))
6d2a5b2
-        self.assertTrue(r.cssText == r2.cssText)
6d2a5b2
-
6d2a5b2
-
6d2a5b2
-if __name__ == '__main__':
6d2a5b2
-    import unittest
6d2a5b2
-    unittest.main()
6d2a5b2
+__version__ = '$Id: test_csspagerule.py 1869 2009-10-17 19:37:40Z cthedot $'
6d2a5b2
+
6d2a5b2
+import xml.dom
6d2a5b2
+from . import test_cssrule
6d2a5b2
+import css_parser
6d2a5b2
+
6d2a5b2
+
6d2a5b2
+class CSSVariablesRuleTestCase(test_cssrule.CSSRuleTestCase):
6d2a5b2
+
6d2a5b2
+    def setUp(self):
6d2a5b2
+        super(CSSVariablesRuleTestCase, self).setUp()
6d2a5b2
+        self.r = css_parser.css.CSSVariablesRule()
6d2a5b2
+        self.rRO = css_parser.css.CSSVariablesRule(readonly=True)
6d2a5b2
+        self.r_type = css_parser.css.CSSPageRule.VARIABLES_RULE
6d2a5b2
+        self.r_typeString = 'VARIABLES_RULE'
6d2a5b2
+
6d2a5b2
+        css_parser.ser.prefs.resolveVariables = False
6d2a5b2
+
6d2a5b2
+    def test_init(self):
6d2a5b2
+        "CSSVariablesRule.__init__()"
6d2a5b2
+        super(CSSVariablesRuleTestCase, self).test_init()
6d2a5b2
+
6d2a5b2
+        r = css_parser.css.CSSVariablesRule()
6d2a5b2
+        self.assertEqual(css_parser.css.CSSVariablesDeclaration,
6d2a5b2
+                         type(r.variables))
6d2a5b2
+        self.assertEqual(r, r.variables.parentRule)
6d2a5b2
+
6d2a5b2
+        # until any variables
6d2a5b2
+        self.assertEqual('', r.cssText)
6d2a5b2
+
6d2a5b2
+        # only possible to set @... similar name
6d2a5b2
+        self.assertRaises(xml.dom.InvalidModificationErr,
6d2a5b2
+                          self.r._setAtkeyword, 'x')
6d2a5b2
+
6d2a5b2
+    def test_InvalidModificationErr(self):
6d2a5b2
+        "CSSVariablesRule.cssText InvalidModificationErr"
6d2a5b2
+        self._test_InvalidModificationErr('@variables')
6d2a5b2
+        tests = {
6d2a5b2
+            '@var {}': xml.dom.InvalidModificationErr,
6d2a5b2
+        }
6d2a5b2
+        self.do_raise_r(tests)
6d2a5b2
+
6d2a5b2
+    def test_incomplete(self):
6d2a5b2
+        "CSSVariablesRule (incomplete)"
6d2a5b2
+        tests = {
6d2a5b2
+            '@variables { ':
6d2a5b2
+                '',  # no } and no content
6d2a5b2
+            '@variables { x: red':
6d2a5b2
+                '@variables {\n    x: red\n    }',  # no }
6d2a5b2
+        }
6d2a5b2
+        self.do_equal_p(tests)  # parse
6d2a5b2
+
6d2a5b2
+    def test_cssText(self):
6d2a5b2
+        "CSSVariablesRule"
6d2a5b2
+        EXP = '@variables {\n    margin: 0\n    }'
6d2a5b2
+        tests = {
6d2a5b2
+            '@variables {}': '',
6d2a5b2
+            '@variables     {margin:0;}': EXP,
6d2a5b2
+            '@variables     {margin:0}': EXP,
6d2a5b2
+            '@VaRIables {   margin    :   0   ;    }': EXP,
6d2a5b2
+            '@\\VaRIables {    margin : 0    }': EXP,
6d2a5b2
+
6d2a5b2
+            '@variables {a:1;b:2}':
6d2a5b2
+                '@variables {\n    a: 1;\n    b: 2\n    }',
6d2a5b2
+
6d2a5b2
+            # comments
6d2a5b2
+            '@variables   /*1*/   {margin:0;}':
6d2a5b2
+                '@variables /*1*/ {\n    margin: 0\n    }',
6d2a5b2
+            '@variables/*1*/{margin:0;}':
6d2a5b2
+                '@variables /*1*/ {\n    margin: 0\n    }',
6d2a5b2
+        }
6d2a5b2
+        self.do_equal_r(tests)
6d2a5b2
+        self.do_equal_p(tests)
6d2a5b2
+
6d2a5b2
+    def test_media(self):
6d2a5b2
+        "CSSVariablesRule.media"
6d2a5b2
+        r = css_parser.css.CSSVariablesRule()
6d2a5b2
+        self.assertRaises(AttributeError, r.__getattribute__, 'media')
6d2a5b2
+        self.assertRaises(AttributeError, r.__setattr__, 'media', '?')
6d2a5b2
+
6d2a5b2
+    def test_variables(self):
6d2a5b2
+        "CSSVariablesRule.variables"
6d2a5b2
+        r = css_parser.css.CSSVariablesRule(
6d2a5b2
+            variables=css_parser.css.CSSVariablesDeclaration('x: 1'))
6d2a5b2
+        self.assertEqual(r, r.variables.parentRule)
6d2a5b2
+
6d2a5b2
+        # cssText
6d2a5b2
+        r = css_parser.css.CSSVariablesRule()
6d2a5b2
+        r.cssText = '@variables { x: 1 }'
6d2a5b2
+        vars1 = r.variables
6d2a5b2
+        self.assertEqual(r, r.variables.parentRule)
6d2a5b2
+        self.assertEqual(vars1, r.variables)
6d2a5b2
+        self.assertEqual(r.variables.cssText, 'x: 1')
6d2a5b2
+        self.assertEqual(r.cssText, '@variables {\n    x: 1\n    }')
6d2a5b2
+
6d2a5b2
+        r.cssText = '@variables {y:2}'
6d2a5b2
+        self.assertEqual(r, r.variables.parentRule)
6d2a5b2
+        self.assertNotEqual(vars1, r.variables)
6d2a5b2
+        self.assertEqual(r.variables.cssText, 'y: 2')
6d2a5b2
+        self.assertEqual(r.cssText, '@variables {\n    y: 2\n    }')
6d2a5b2
+
6d2a5b2
+        vars2 = r.variables
6d2a5b2
+
6d2a5b2
+        # fail
6d2a5b2
+        try:
6d2a5b2
+            r.cssText = '@variables {$:1}'
6d2a5b2
+        except xml.dom.DOMException as e:
6d2a5b2
+            pass
6d2a5b2
+
6d2a5b2
+        self.assertEqual(vars2, r.variables)
6d2a5b2
+        self.assertEqual(r.variables.cssText, 'y: 2')
6d2a5b2
+        self.assertEqual(r.cssText, '@variables {\n    y: 2\n    }')
6d2a5b2
+
6d2a5b2
+        # var decl
6d2a5b2
+        vars3 = css_parser.css.CSSVariablesDeclaration('z: 3')
6d2a5b2
+        r.variables = vars3
6d2a5b2
+
6d2a5b2
+        self.assertEqual(r, r.variables.parentRule)
6d2a5b2
+        self.assertEqual(vars3, r.variables)
6d2a5b2
+        self.assertEqual(r.variables.cssText, 'z: 3')
6d2a5b2
+        self.assertEqual(r.cssText, '@variables {\n    z: 3\n    }')
6d2a5b2
+
6d2a5b2
+        # string
6d2a5b2
+        r.variables = 'a: x'
6d2a5b2
+        self.assertNotEqual(vars3, r.variables)
6d2a5b2
+        self.assertEqual(r, r.variables.parentRule)
6d2a5b2
+        self.assertEqual(r.variables.cssText, 'a: x')
6d2a5b2
+        self.assertEqual(r.cssText, '@variables {\n    a: x\n    }')
6d2a5b2
+        vars4 = r.variables
6d2a5b2
+
6d2a5b2
+        # string fail
6d2a5b2
+        try:
6d2a5b2
+            r.variables = '$: x'
6d2a5b2
+        except xml.dom.DOMException as e:
6d2a5b2
+            pass
6d2a5b2
+        self.assertEqual(vars4, r.variables)
6d2a5b2
+        self.assertEqual(r, r.variables.parentRule)
6d2a5b2
+        self.assertEqual(r.variables.cssText, 'a: x')
6d2a5b2
+        self.assertEqual(r.cssText, '@variables {\n    a: x\n    }')
6d2a5b2
+
6d2a5b2
+    def test_reprANDstr(self):
6d2a5b2
+        "CSSVariablesRule.__repr__(), .__str__()"
6d2a5b2
+        r = css_parser.css.CSSVariablesRule()
6d2a5b2
+        r.cssText = '@variables { xxx: 1 }'
6d2a5b2
+        self.assertIn('xxx', str(r))
6d2a5b2
+
6d2a5b2
+        r2 = eval(repr(r))
6d2a5b2
+        self.assertIsInstance(r2, r.__class__)
6d2a5b2
+        self.assertEqual(r.cssText, r2.cssText)
6d2a5b2
+
6d2a5b2
+
6d2a5b2
+if __name__ == '__main__':
6d2a5b2
+    import unittest
6d2a5b2
+    unittest.main()
6d2a5b2
diff --git a/css_parser_tests/test_domimplementation.py b/css_parser_tests/test_domimplementation.py
6d2a5b2
index ec248bf..857857e 100644
6d2a5b2
--- a/css_parser_tests/test_domimplementation.py
6d2a5b2
+++ b/css_parser_tests/test_domimplementation.py
6d2a5b2
@@ -1,47 +1,47 @@
6d2a5b2
-"""Testcases for css_parser.css.DOMImplementation"""
6d2a5b2
-
6d2a5b2
+"""Testcases for css_parser.css.DOMImplementation"""
6d2a5b2
+
6d2a5b2
 from __future__ import absolute_import
6d2a5b2
 from __future__ import unicode_literals
6d2a5b2
-import xml.dom
6d2a5b2
-import xml.dom.minidom
6d2a5b2
-import unittest
6d2a5b2
-import css_parser
6d2a5b2
-
6d2a5b2
-
6d2a5b2
-class DOMImplementationTestCase(unittest.TestCase):
6d2a5b2
-
6d2a5b2
-    def setUp(self):
6d2a5b2
-        self.domimpl = css_parser.DOMImplementationCSS()
6d2a5b2
-
6d2a5b2
-    def test_createCSSStyleSheet(self):
6d2a5b2
-        "DOMImplementationCSS.createCSSStyleSheet()"
6d2a5b2
-        title, media = 'Test Title', css_parser.stylesheets.MediaList('all')
6d2a5b2
-        sheet = self.domimpl.createCSSStyleSheet(title, media)
6d2a5b2
-        self.assertEqual(True, isinstance(sheet, css_parser.css.CSSStyleSheet))
6d2a5b2
-        self.assertEqual(title, sheet.title)
6d2a5b2
-        self.assertEqual(media, sheet.media)
6d2a5b2
-
6d2a5b2
-    def test_createDocument(self):
6d2a5b2
-        "DOMImplementationCSS.createDocument()"
6d2a5b2
-        doc = self.domimpl.createDocument(None, None, None)
6d2a5b2
-        self.assertTrue(isinstance(doc, xml.dom.minidom.Document))
6d2a5b2
-
6d2a5b2
-    def test_createDocumentType(self):
6d2a5b2
-        "DOMImplementationCSS.createDocumentType()"
6d2a5b2
-        doctype = self.domimpl.createDocumentType('foo', 'bar', 'raboof')
6d2a5b2
-        self.assertTrue(isinstance(doctype, xml.dom.minidom.DocumentType))
6d2a5b2
-
6d2a5b2
-    def test_hasFeature(self):
6d2a5b2
-        "DOMImplementationCSS.hasFeature()"
6d2a5b2
-        tests = [
6d2a5b2
-            ('css', '1.0'),
6d2a5b2
-            ('css', '2.0'),
6d2a5b2
-            ('stylesheets', '1.0'),
6d2a5b2
-            ('stylesheets', '2.0')
6d2a5b2
-        ]
6d2a5b2
-        for name, version in tests:
6d2a5b2
-            self.assertEqual(True, self.domimpl.hasFeature(name, version))
6d2a5b2
-
6d2a5b2
-
6d2a5b2
-if __name__ == '__main__':
6d2a5b2
-    unittest.main()
6d2a5b2
+import xml.dom
6d2a5b2
+import xml.dom.minidom
6d2a5b2
+import unittest
6d2a5b2
+import css_parser
6d2a5b2
+
6d2a5b2
+
6d2a5b2
+class DOMImplementationTestCase(unittest.TestCase):
6d2a5b2
+
6d2a5b2
+    def setUp(self):
6d2a5b2
+        self.domimpl = css_parser.DOMImplementationCSS()
6d2a5b2
+
6d2a5b2
+    def test_createCSSStyleSheet(self):
6d2a5b2
+        "DOMImplementationCSS.createCSSStyleSheet()"
6d2a5b2
+        title, media = 'Test Title', css_parser.stylesheets.MediaList('all')
6d2a5b2
+        sheet = self.domimpl.createCSSStyleSheet(title, media)
6d2a5b2
+        self.assertEqual(True, isinstance(sheet, css_parser.css.CSSStyleSheet))
6d2a5b2
+        self.assertEqual(title, sheet.title)
6d2a5b2
+        self.assertEqual(media, sheet.media)
6d2a5b2
+
6d2a5b2
+    def test_createDocument(self):
6d2a5b2
+        "DOMImplementationCSS.createDocument()"
6d2a5b2
+        doc = self.domimpl.createDocument(None, None, None)
6d2a5b2
+        self.assertIsInstance(doc, xml.dom.minidom.Document)
6d2a5b2
+
6d2a5b2
+    def test_createDocumentType(self):
6d2a5b2
+        "DOMImplementationCSS.createDocumentType()"
6d2a5b2
+        doctype = self.domimpl.createDocumentType('foo', 'bar', 'raboof')
6d2a5b2
+        self.assertIsInstance(doctype, xml.dom.minidom.DocumentType)
6d2a5b2
+
6d2a5b2
+    def test_hasFeature(self):
6d2a5b2
+        "DOMImplementationCSS.hasFeature()"
6d2a5b2
+        tests = [
6d2a5b2
+            ('css', '1.0'),
6d2a5b2
+            ('css', '2.0'),
6d2a5b2
+            ('stylesheets', '1.0'),
6d2a5b2
+            ('stylesheets', '2.0')
6d2a5b2
+        ]
6d2a5b2
+        for name, version in tests:
6d2a5b2
+            self.assertEqual(True, self.domimpl.hasFeature(name, version))
6d2a5b2
+
6d2a5b2
+
6d2a5b2
+if __name__ == '__main__':
6d2a5b2
+    unittest.main()
6d2a5b2
diff --git a/css_parser_tests/test_marginrule.py b/css_parser_tests/test_marginrule.py
6d2a5b2
index 1fcda78..03b3c2c 100644
6d2a5b2
--- a/css_parser_tests/test_marginrule.py
6d2a5b2
+++ b/css_parser_tests/test_marginrule.py
6d2a5b2
@@ -88,11 +88,11 @@ def test_reprANDstr(self):
6d2a5b2
 
6d2a5b2
         s = css_parser.css.MarginRule(margin=margin, style='left: 0')
6d2a5b2
 
6d2a5b2
-        self.assertTrue(margin in str(s))
6d2a5b2
+        self.assertIn(margin, str(s))
6d2a5b2
 
6d2a5b2
         s2 = eval(repr(s))
6d2a5b2
-        self.assertTrue(isinstance(s2, s.__class__))
6d2a5b2
-        self.assertTrue(margin == s2.margin)
6d2a5b2
+        self.assertIsInstance(s2, s.__class__)
6d2a5b2
+        self.assertEqual(margin, s2.margin)
6d2a5b2
 
6d2a5b2
 
6d2a5b2
 if __name__ == '__main__':
6d2a5b2
diff --git a/css_parser_tests/test_medialist.py b/css_parser_tests/test_medialist.py
6d2a5b2
index e5b24f1..6d99edf 100644
6d2a5b2
--- a/css_parser_tests/test_medialist.py
6d2a5b2
+++ b/css_parser_tests/test_medialist.py
6d2a5b2
@@ -193,11 +193,11 @@ def test_reprANDstr(self):
6d2a5b2
 
6d2a5b2
         s = css_parser.stylesheets.MediaList(mediaText=mediaText)
6d2a5b2
 
6d2a5b2
-        self.assertTrue(mediaText in str(s))
6d2a5b2
+        self.assertIn(mediaText, str(s))
6d2a5b2
 
6d2a5b2
         s2 = eval(repr(s))
6d2a5b2
-        self.assertTrue(isinstance(s2, s.__class__))
6d2a5b2
-        self.assertTrue(mediaText == s2.mediaText)
6d2a5b2
+        self.assertIsInstance(s2, s.__class__)
6d2a5b2
+        self.assertEqual(mediaText, s2.mediaText)
6d2a5b2
 
6d2a5b2
 
6d2a5b2
 if __name__ == '__main__':
6d2a5b2
diff --git a/css_parser_tests/test_mediaquery.py b/css_parser_tests/test_mediaquery.py
6d2a5b2
index b8582cc..91742f8 100644
6d2a5b2
--- a/css_parser_tests/test_mediaquery.py
6d2a5b2
+++ b/css_parser_tests/test_mediaquery.py
6d2a5b2
@@ -1,108 +1,108 @@
6d2a5b2
-# -*- coding: iso-8859-1 -*-
6d2a5b2
-"""Testcases for css_parser.stylesheets.MediaQuery"""
6d2a5b2
-
6d2a5b2
-from __future__ import absolute_import
6d2a5b2
-from __future__ import unicode_literals
6d2a5b2
-import xml.dom
6d2a5b2
-import logging
6d2a5b2
-from . import basetest
6d2a5b2
-import css_parser.stylesheets
6d2a5b2
-
6d2a5b2
-
6d2a5b2
-class MediaQueryTestCase(basetest.BaseTestCase):
6d2a5b2
-
6d2a5b2
-    def setUp(self):
6d2a5b2
-        super(MediaQueryTestCase, self).setUp()
6d2a5b2
-        self.r = css_parser.stylesheets.MediaQuery()
6d2a5b2
-
6d2a5b2
-    def test_mediaText(self):
6d2a5b2
-        "MediaQuery.mediaText"
6d2a5b2
-        tests = {
6d2a5b2
-            'all': None,
6d2a5b2
-            'braille': None,
6d2a5b2
-            'embossed': None,
6d2a5b2
-            'handheld': None,
6d2a5b2
-            'print': None,
6d2a5b2
-            'projection': None,
6d2a5b2
-            'screen': None,
6d2a5b2
-            'speech': None,
6d2a5b2
-            'tty': None,
6d2a5b2
-            'tv': None,
6d2a5b2
-            'ALL': None,
6d2a5b2
-            'a\\ll': None,
6d2a5b2
-            'not tv': None,
6d2a5b2
-            'n\\ot t\\v': None,
6d2a5b2
-            'only tv': None,
6d2a5b2
-            '\\only \\tv': None,
6d2a5b2
-            'PRINT': None,
6d2a5b2
-            'NOT PRINT': None,
6d2a5b2
-            'ONLY PRINT': None,
6d2a5b2
-            'tv and (color)': None,
6d2a5b2
-            'not tv and (color)': None,
6d2a5b2
-            'only tv and (color)': None,
6d2a5b2
-            'print and(color)': 'print and (color)',
6d2a5b2
-            'aural': None  # xml.dom.SyntaxErr in cssutils
6d2a5b2
-        }
6d2a5b2
-        self.do_equal_r(tests, att='mediaText')
6d2a5b2
-
6d2a5b2
-        tests = {
6d2a5b2
-            '': xml.dom.SyntaxErr,
6d2a5b2
-            'two values': xml.dom.SyntaxErr,
6d2a5b2
-            'or even three': xml.dom.SyntaxErr,
6d2a5b2
-            '3d': xml.dom.SyntaxErr,  # a dimension
6d2a5b2
-        }
6d2a5b2
-        self.do_raise_r(tests, att='_setMediaText')
6d2a5b2
-
6d2a5b2
-    def test_mediaType(self):
6d2a5b2
-        "MediaQuery.mediaType"
6d2a5b2
-        mq = css_parser.stylesheets.MediaQuery()
6d2a5b2
-
6d2a5b2
-        self.assertEqual('', mq.mediaText)
6d2a5b2
-
6d2a5b2
-        for mt in css_parser.stylesheets.MediaQuery.MEDIA_TYPES:
6d2a5b2
-            mq.mediaType = mt
6d2a5b2
-            self.assertEqual(mq.mediaType, mt)
6d2a5b2
-            mq.mediaType = mt.upper()
6d2a5b2
-            self.assertEqual(mq.mediaType, mt.upper())
6d2a5b2
-
6d2a5b2
-        mt = '3D-UNKOwn-MEDIAtype0123'
6d2a5b2
-        #mq.mediaType = mt
6d2a5b2
-        self.assertEqual(self.captureLog(logging.WARNING, mq._setMediaType, mt),
6d2a5b2
-                         'WARNING    MediaQuery: Unknown media type: "3D-UNKOwn-MEDIAtype0123".\n')
6d2a5b2
-        #self.assertRaises(xml.dom.InvalidCharacterErr, mq._setMediaType, mt)
6d2a5b2
-
6d2a5b2
-    def test_comments(self):
6d2a5b2
-        "MediaQuery.mediaText comments"
6d2a5b2
-        tests = {
6d2a5b2
-            'all': None,
6d2a5b2
-            'print': None,
6d2a5b2
-            'not print': None,
6d2a5b2
-            'only print': None,
6d2a5b2
-            'print and (color)': None,
6d2a5b2
-            'print and (color) and (width)': None,
6d2a5b2
-            'print and (color: 2)': None,
6d2a5b2
-            'print and (min-width: 100px)': None,
6d2a5b2
-            'print and (min-width: 100px) and (color: red)': None,
6d2a5b2
-            'not print and (min-width: 100px)': None,
6d2a5b2
-            'only print and (min-width: 100px)': None,
6d2a5b2
-            '/*1*/ tv /*2*/': None,
6d2a5b2
-            '/*0*/ only /*1*/ tv /*2*/': None,
6d2a5b2
-            '/*0* /not /*1*/ tv /*2*/': None,
6d2a5b2
-            '/*x*/ only /*x*/ print /*x*/ and /*x*/ (/*x*/ min-width /*x*/: /*x*/ 100px /*x*/)': None,
6d2a5b2
-            'print and/*1*/(color)': 'print and /*1*/ (color)'
6d2a5b2
-        }
6d2a5b2
-        self.do_equal_r(tests, att='mediaText')
6d2a5b2
-
6d2a5b2
-    def test_reprANDstr(self):
6d2a5b2
-        "MediaQuery.__repr__(), .__str__()"
6d2a5b2
-        mediaText = 'tv and (color)'
6d2a5b2
-        s = css_parser.stylesheets.MediaQuery(mediaText=mediaText)
6d2a5b2
-        self.assertTrue(mediaText in str(s))
6d2a5b2
-        s2 = eval(repr(s))
6d2a5b2
-        self.assertEqual(mediaText, s2.mediaText)
6d2a5b2
-        self.assertTrue(isinstance(s2, s.__class__))
6d2a5b2
-
6d2a5b2
-
6d2a5b2
-if __name__ == '__main__':
6d2a5b2
-    import unittest
6d2a5b2
-    unittest.main()
6d2a5b2
+# -*- coding: iso-8859-1 -*-
6d2a5b2
+"""Testcases for css_parser.stylesheets.MediaQuery"""
6d2a5b2
+
6d2a5b2
+from __future__ import absolute_import
6d2a5b2
+from __future__ import unicode_literals
6d2a5b2
+import xml.dom
6d2a5b2
+import logging
6d2a5b2
+from . import basetest
6d2a5b2
+import css_parser.stylesheets
6d2a5b2
+
6d2a5b2
+
6d2a5b2
+class MediaQueryTestCase(basetest.BaseTestCase):
6d2a5b2
+
6d2a5b2
+    def setUp(self):
6d2a5b2
+        super(MediaQueryTestCase, self).setUp()
6d2a5b2
+        self.r = css_parser.stylesheets.MediaQuery()
6d2a5b2
+
6d2a5b2
+    def test_mediaText(self):
6d2a5b2
+        "MediaQuery.mediaText"
6d2a5b2
+        tests = {
6d2a5b2
+            'all': None,
6d2a5b2
+            'braille': None,
6d2a5b2
+            'embossed': None,
6d2a5b2
+            'handheld': None,
6d2a5b2
+            'print': None,
6d2a5b2
+            'projection': None,
6d2a5b2
+            'screen': None,
6d2a5b2
+            'speech': None,
6d2a5b2
+            'tty': None,
6d2a5b2
+            'tv': None,
6d2a5b2
+            'ALL': None,
6d2a5b2
+            'a\\ll': None,
6d2a5b2
+            'not tv': None,
6d2a5b2
+            'n\\ot t\\v': None,
6d2a5b2
+            'only tv': None,
6d2a5b2
+            '\\only \\tv': None,
6d2a5b2
+            'PRINT': None,
6d2a5b2
+            'NOT PRINT': None,
6d2a5b2
+            'ONLY PRINT': None,
6d2a5b2
+            'tv and (color)': None,
6d2a5b2
+            'not tv and (color)': None,
6d2a5b2
+            'only tv and (color)': None,
6d2a5b2
+            'print and(color)': 'print and (color)',
6d2a5b2
+            'aural': None  # xml.dom.SyntaxErr in cssutils
6d2a5b2
+        }
6d2a5b2
+        self.do_equal_r(tests, att='mediaText')
6d2a5b2
+
6d2a5b2
+        tests = {
6d2a5b2
+            '': xml.dom.SyntaxErr,
6d2a5b2
+            'two values': xml.dom.SyntaxErr,
6d2a5b2
+            'or even three': xml.dom.SyntaxErr,
6d2a5b2
+            '3d': xml.dom.SyntaxErr,  # a dimension
6d2a5b2
+        }
6d2a5b2
+        self.do_raise_r(tests, att='_setMediaText')
6d2a5b2
+
6d2a5b2
+    def test_mediaType(self):
6d2a5b2
+        "MediaQuery.mediaType"
6d2a5b2
+        mq = css_parser.stylesheets.MediaQuery()
6d2a5b2
+
6d2a5b2
+        self.assertEqual('', mq.mediaText)
6d2a5b2
+
6d2a5b2
+        for mt in css_parser.stylesheets.MediaQuery.MEDIA_TYPES:
6d2a5b2
+            mq.mediaType = mt
6d2a5b2
+            self.assertEqual(mq.mediaType, mt)
6d2a5b2
+            mq.mediaType = mt.upper()
6d2a5b2
+            self.assertEqual(mq.mediaType, mt.upper())
6d2a5b2
+
6d2a5b2
+        mt = '3D-UNKOwn-MEDIAtype0123'
6d2a5b2
+        #mq.mediaType = mt
6d2a5b2
+        self.assertEqual(self.captureLog(logging.WARNING, mq._setMediaType, mt),
6d2a5b2
+                         'WARNING    MediaQuery: Unknown media type: "3D-UNKOwn-MEDIAtype0123".\n')
6d2a5b2
+        #self.assertRaises(xml.dom.InvalidCharacterErr, mq._setMediaType, mt)
6d2a5b2
+
6d2a5b2
+    def test_comments(self):
6d2a5b2
+        "MediaQuery.mediaText comments"
6d2a5b2
+        tests = {
6d2a5b2
+            'all': None,
6d2a5b2
+            'print': None,
6d2a5b2
+            'not print': None,
6d2a5b2
+            'only print': None,
6d2a5b2
+            'print and (color)': None,
6d2a5b2
+            'print and (color) and (width)': None,
6d2a5b2
+            'print and (color: 2)': None,
6d2a5b2
+            'print and (min-width: 100px)': None,
6d2a5b2
+            'print and (min-width: 100px) and (color: red)': None,
6d2a5b2
+            'not print and (min-width: 100px)': None,
6d2a5b2
+            'only print and (min-width: 100px)': None,
6d2a5b2
+            '/*1*/ tv /*2*/': None,
6d2a5b2
+            '/*0*/ only /*1*/ tv /*2*/': None,
6d2a5b2
+            '/*0* /not /*1*/ tv /*2*/': None,
6d2a5b2
+            '/*x*/ only /*x*/ print /*x*/ and /*x*/ (/*x*/ min-width /*x*/: /*x*/ 100px /*x*/)': None,
6d2a5b2
+            'print and/*1*/(color)': 'print and /*1*/ (color)'
6d2a5b2
+        }
6d2a5b2
+        self.do_equal_r(tests, att='mediaText')
6d2a5b2
+
6d2a5b2
+    def test_reprANDstr(self):
6d2a5b2
+        "MediaQuery.__repr__(), .__str__()"
6d2a5b2
+        mediaText = 'tv and (color)'
6d2a5b2
+        s = css_parser.stylesheets.MediaQuery(mediaText=mediaText)
6d2a5b2
+        self.assertIn(mediaText, str(s))
6d2a5b2
+        s2 = eval(repr(s))
6d2a5b2
+        self.assertEqual(mediaText, s2.mediaText)
6d2a5b2
+        self.assertIsInstance(s2, s.__class__)
6d2a5b2
+
6d2a5b2
+
6d2a5b2
+if __name__ == '__main__':
6d2a5b2
+    import unittest
6d2a5b2
+    unittest.main()
6d2a5b2
diff --git a/css_parser_tests/test_property.py b/css_parser_tests/test_property.py
6d2a5b2
index 561a5eb..ad99103 100644
6d2a5b2
--- a/css_parser_tests/test_property.py
6d2a5b2
+++ b/css_parser_tests/test_property.py
6d2a5b2
@@ -259,15 +259,15 @@ def test_reprANDstr(self):
6d2a5b2
 
6d2a5b2
         s = css_parser.css.property.Property(name=name, value=value, priority=priority)
6d2a5b2
 
6d2a5b2
-        self.assertTrue(name in str(s))
6d2a5b2
-        self.assertTrue(value in str(s))
6d2a5b2
-        self.assertTrue(priority in str(s))
6d2a5b2
+        self.assertIn(name, str(s))
6d2a5b2
+        self.assertIn(value, str(s))
6d2a5b2
+        self.assertIn(priority, str(s))
6d2a5b2
 
6d2a5b2
         s2 = eval(repr(s))
6d2a5b2
-        self.assertTrue(isinstance(s2, s.__class__))
6d2a5b2
-        self.assertTrue(name == s2.name)
6d2a5b2
-        self.assertTrue(value == s2.value)
6d2a5b2
-        self.assertTrue(priority == s2.priority)
6d2a5b2
+        self.assertIsInstance(s2, s.__class__)
6d2a5b2
+        self.assertEqual(name, s2.name)
6d2a5b2
+        self.assertEqual(value, s2.value)
6d2a5b2
+        self.assertEqual(priority, s2.priority)
6d2a5b2
 
6d2a5b2
 
6d2a5b2
 if __name__ == '__main__':
6d2a5b2
diff --git a/css_parser_tests/test_selector.py b/css_parser_tests/test_selector.py
6d2a5b2
index f2746d8..70a9559 100644
6d2a5b2
--- a/css_parser_tests/test_selector.py
6d2a5b2
+++ b/css_parser_tests/test_selector.py
6d2a5b2
@@ -486,11 +486,11 @@ def test_reprANDstr(self):
6d2a5b2
 
6d2a5b2
         s = css_parser.css.Selector(selectorText=sel)
6d2a5b2
 
6d2a5b2
-        self.assertTrue(sel in str(s))
6d2a5b2
+        self.assertIn(sel, str(s))
6d2a5b2
 
6d2a5b2
         s2 = eval(repr(s))
6d2a5b2
-        self.assertTrue(isinstance(s2, s.__class__))
6d2a5b2
-        self.assertTrue(sel == s2.selectorText)
6d2a5b2
+        self.assertIsInstance(s2, s.__class__)
6d2a5b2
+        self.assertEqual(sel, s2.selectorText)
6d2a5b2
 
6d2a5b2
 
6d2a5b2
 if __name__ == '__main__':
6d2a5b2
diff --git a/css_parser_tests/test_selectorlist.py b/css_parser_tests/test_selectorlist.py
6d2a5b2
index 54c945a..4bb256c 100644
6d2a5b2
--- a/css_parser_tests/test_selectorlist.py
6d2a5b2
+++ b/css_parser_tests/test_selectorlist.py
6d2a5b2
@@ -139,10 +139,10 @@ def test_reprANDstr(self):
6d2a5b2
 
6d2a5b2
         s = css_parser.css.SelectorList(selectorText=sel)
6d2a5b2
 
6d2a5b2
-        self.assertTrue(sel[0] in str(s))
6d2a5b2
+        self.assertIn(sel[0], str(s))
6d2a5b2
 
6d2a5b2
         s2 = eval(repr(s))
6d2a5b2
-        self.assertTrue(isinstance(s2, s.__class__))
6d2a5b2
+        self.assertIsInstance(s2, s.__class__)
6d2a5b2
         self.assertEqual(sel[0], s2.selectorText)
6d2a5b2
 
6d2a5b2
 
6d2a5b2
diff --git a/css_parser_tests/test_value.py b/css_parser_tests/test_value.py
6d2a5b2
index 2dcd912..252cfcf 100644
6d2a5b2
--- a/css_parser_tests/test_value.py
6d2a5b2
+++ b/css_parser_tests/test_value.py
6d2a5b2
@@ -358,10 +358,10 @@ def test_incomplete(self):
6d2a5b2
     def test_readonly(self):
6d2a5b2
         "PropertyValue._readonly"
6d2a5b2
         v = css_parser.css.PropertyValue(cssText='inherit')
6d2a5b2
-        self.assertTrue(False is v._readonly)
6d2a5b2
+        self.assertIs(False, v._readonly)
6d2a5b2
 
6d2a5b2
         v = css_parser.css.PropertyValue(cssText='inherit', readonly=True)
6d2a5b2
-        self.assertTrue(True is v._readonly)
6d2a5b2
+        self.assertIs(True, v._readonly)
6d2a5b2
         self.assertTrue('inherit', v.cssText)
6d2a5b2
         self.assertRaises(xml.dom.NoModificationAllowedErr, v._setCssText, 'x')
6d2a5b2
         self.assertTrue('inherit', v.cssText)
6d2a5b2
@@ -372,11 +372,11 @@ def test_reprANDstr(self):
6d2a5b2
 
6d2a5b2
         s = css_parser.css.PropertyValue(cssText=cssText)
6d2a5b2
 
6d2a5b2
-        self.assertTrue(cssText in str(s))
6d2a5b2
+        self.assertIn(cssText, str(s))
6d2a5b2
 
6d2a5b2
         s2 = eval(repr(s))
6d2a5b2
-        self.assertTrue(isinstance(s2, s.__class__))
6d2a5b2
-        self.assertTrue(cssText == s2.cssText)
6d2a5b2
+        self.assertIsInstance(s2, s.__class__)
6d2a5b2
+        self.assertEqual(cssText, s2.cssText)
6d2a5b2
 
6d2a5b2
 
6d2a5b2
 class ValueTestCase(basetest.BaseTestCase):
6d2a5b2
@@ -384,9 +384,9 @@ class ValueTestCase(basetest.BaseTestCase):
6d2a5b2
     def test_init(self):
6d2a5b2
         "Value.__init__()"
6d2a5b2
         v = css_parser.css.Value()
6d2a5b2
-        self.assertTrue('' == v.cssText)
6d2a5b2
-        self.assertTrue('' == v.value)
6d2a5b2
-        self.assertTrue(None is v.type)
6d2a5b2
+        self.assertEqual('', v.cssText)
6d2a5b2
+        self.assertEqual('', v.value)
6d2a5b2
+        self.assertIs(None, v.type)
6d2a5b2
 
6d2a5b2
     def test_cssText(self):
6d2a5b2
         "Value.cssText"
6d2a5b2
@@ -425,8 +425,8 @@ def test_init(self):
6d2a5b2
         "ColorValue.__init__()"
6d2a5b2
         v = css_parser.css.ColorValue()
6d2a5b2
         self.assertEqual(v.COLOR_VALUE, v.type)
6d2a5b2
-        self.assertTrue('' == v.cssText)
6d2a5b2
-        self.assertTrue('' == v.value)
6d2a5b2
+        self.assertEqual('', v.cssText)
6d2a5b2
+        self.assertEqual('', v.value)
6d2a5b2
         self.assertEqual('transparent', v.name)
6d2a5b2
         self.assertEqual(None, v.colorType)
6d2a5b2
 
6d2a5b2
@@ -532,19 +532,19 @@ class URIValueTestCase(basetest.BaseTestCase):
6d2a5b2
     def test_init(self):
6d2a5b2
         "URIValue.__init__()"
6d2a5b2
         v = css_parser.css.URIValue()
6d2a5b2
-        self.assertTrue('url()' == v.cssText)
6d2a5b2
-        self.assertTrue('' == v.value)
6d2a5b2
-        self.assertTrue('' == v.uri)
6d2a5b2
-        self.assertTrue(v.URI is v.type)
6d2a5b2
+        self.assertEqual('url()', v.cssText)
6d2a5b2
+        self.assertEqual('', v.value)
6d2a5b2
+        self.assertEqual('', v.uri)
6d2a5b2
+        self.assertIs(v.URI, v.type)
6d2a5b2
 
6d2a5b2
         v.uri = '1'
6d2a5b2
-        self.assertTrue('1' == v.value)
6d2a5b2
-        self.assertTrue('1' == v.uri)
6d2a5b2
+        self.assertEqual('1', v.value)
6d2a5b2
+        self.assertEqual('1', v.uri)
6d2a5b2
         self.assertEqual('url(1)', v.cssText)
6d2a5b2
 
6d2a5b2
         v.value = '2'
6d2a5b2
-        self.assertTrue('2' == v.value)
6d2a5b2
-        self.assertTrue('2' == v.uri)
6d2a5b2
+        self.assertEqual('2', v.value)
6d2a5b2
+        self.assertEqual('2', v.uri)
6d2a5b2
         self.assertEqual('url(2)', v.cssText)
6d2a5b2
 
6d2a5b2
     def test_absoluteUri(self):
6d2a5b2
@@ -601,10 +601,10 @@ class DimensionValueTestCase(basetest.BaseTestCase):
6d2a5b2
     def test_init(self):
6d2a5b2
         "DimensionValue.__init__()"
6d2a5b2
         v = css_parser.css.DimensionValue()
6d2a5b2
-        self.assertTrue('' == v.cssText)
6d2a5b2
-        self.assertTrue('' == v.value)
6d2a5b2
-        self.assertTrue(None is v.type)
6d2a5b2
-        self.assertTrue(None is v.dimension)
6d2a5b2
+        self.assertEqual('', v.cssText)
6d2a5b2
+        self.assertEqual('', v.value)
6d2a5b2
+        self.assertIs(None, v.type)
6d2a5b2
+        self.assertIs(None, v.dimension)
6d2a5b2
 
6d2a5b2
     def test_cssText(self):
6d2a5b2
         "DimensionValue.cssText"
6d2a5b2
@@ -696,8 +696,8 @@ def test_init(self):
6d2a5b2
         v = css_parser.css.CSSVariable()
6d2a5b2
         self.assertEqual('', v.cssText)
6d2a5b2
         self.assertEqual('VARIABLE', v.type)
6d2a5b2
-        self.assertTrue(None is v.name)
6d2a5b2
-        self.assertTrue(None is v.value)
6d2a5b2
+        self.assertIs(None, v.name)
6d2a5b2
+        self.assertIs(None, v.value)
6d2a5b2
 
6d2a5b2
     def test_cssText(self):
6d2a5b2
         "CSSVariable.cssText"