Пример #1
0
    def test_strict_ordering_on_append_list_with_flags_factory_extend(self):
        FooList = StrictOrderingOnAppendListWithFlagsFactory({
            'foo': bool,
            'bar': unicode
        })
        foo = FooList(['a', 'b', 'c'])
        foo['a'].foo = True
        foo['b'].bar = 'bar'

        # Don't allow extending lists with different flag definitions.
        BarList = StrictOrderingOnAppendListWithFlagsFactory({
            'foo': unicode,
            'baz': bool
        })
        bar = BarList(['d', 'e', 'f'])
        bar['d'].foo = 'foo'
        bar['e'].baz = True
        with self.assertRaises(ValueError):
            foo + bar
        with self.assertRaises(ValueError):
            bar + foo

        # It's not obvious what to do with duplicate list items with possibly
        # different flag values, so don't allow that case.
        with self.assertRaises(ValueError):
            foo + foo

        def assertExtended(l):
            self.assertEqual(len(l), 6)
            self.assertEqual(l['a'].foo, True)
            self.assertEqual(l['b'].bar, 'bar')
            self.assertTrue('c' in l)
            self.assertEqual(l['d'].foo, True)
            self.assertEqual(l['e'].bar, 'bar')
            self.assertTrue('f' in l)

        # Test extend.
        zot = FooList(['d', 'e', 'f'])
        zot['d'].foo = True
        zot['e'].bar = 'bar'
        zot.extend(foo)
        assertExtended(zot)

        # Test __add__.
        zot = FooList(['d', 'e', 'f'])
        zot['d'].foo = True
        zot['e'].bar = 'bar'
        assertExtended(foo + zot)
        assertExtended(zot + foo)

        # Test __iadd__.
        foo += zot
        assertExtended(foo)

        # Test __setslice__.
        foo[3:] = []
        self.assertEqual(len(foo), 3)
        foo[3:] = zot
        assertExtended(foo)
Пример #2
0
    def test_strict_ordering_on_append_list_with_flags_factory(self):
        cls = StrictOrderingOnAppendListWithFlagsFactory({
            'foo': bool,
            'bar': int,
        })

        l = cls()
        l += ['a', 'b']

        with self.assertRaises(Exception):
            l['a'] = 'foo'

        with self.assertRaises(Exception):
            c = l['c']

        self.assertEqual(l['a'].foo, False)
        l['a'].foo = True
        self.assertEqual(l['a'].foo, True)

        with self.assertRaises(TypeError):
            l['a'].bar = 'bar'

        self.assertEqual(l['a'].bar, 0)
        l['a'].bar = 42
        self.assertEqual(l['a'].bar, 42)

        l['b'].foo = True
        self.assertEqual(l['b'].foo, True)

        with self.assertRaises(AttributeError):
            l['b'].baz = False
Пример #3
0
    def test_path_typed_list(self):
        config = self.config
        ctxt1 = Context(config=config)
        ctxt1.push_source(mozpath.join(config.topsrcdir, "foo", "moz.build"))
        ctxt2 = Context(config=config)
        ctxt2.push_source(mozpath.join(config.topsrcdir, "bar", "moz.build"))

        paths = [
            "!../bar/qux",
            "!/qux/qux",
            "!qux",
            "../bar/qux",
            "/qux/qux",
            "qux",
        ]

        MyList = ContextDerivedTypedList(Path)
        l = MyList(ctxt1)
        l += paths

        for p_str, p_path in zip(paths, l):
            self.assertEqual(p_str, p_path)
            self.assertEqual(p_path, Path(ctxt1, p_str))
            self.assertEqual(p_path.join("foo"),
                             Path(ctxt1, mozpath.join(p_str, "foo")))

        l2 = MyList(ctxt2)
        l2 += paths

        for p_str, p_path in zip(paths, l2):
            self.assertEqual(p_str, p_path)
            self.assertEqual(p_path, Path(ctxt2, p_str))

        # Assigning with Paths from another context doesn't rebase them
        l2 = MyList(ctxt2)
        l2 += l

        for p_str, p_path in zip(paths, l2):
            self.assertEqual(p_str, p_path)
            self.assertEqual(p_path, Path(ctxt1, p_str))

        MyListWithFlags = ContextDerivedTypedListWithItems(
            Path,
            StrictOrderingOnAppendListWithFlagsFactory({
                "foo": bool,
            }),
        )
        l = MyListWithFlags(ctxt1)
        l += paths

        for p in paths:
            l[p].foo = True

        for p_str, p_path in zip(paths, l):
            self.assertEqual(p_str, p_path)
            self.assertEqual(p_path, Path(ctxt1, p_str))
            self.assertEqual(l[p_str].foo, True)
            self.assertEqual(l[p_path].foo, True)
Пример #4
0
    def test_strict_ordering_on_append_list_with_flags_factory(self):
        cls = StrictOrderingOnAppendListWithFlagsFactory({
            "foo": bool,
            "bar": int,
        })

        l = cls()
        l += ["a", "b"]

        with self.assertRaises(Exception):
            l["a"] = "foo"

        with self.assertRaises(Exception):
            l["c"]

        self.assertEqual(l["a"].foo, False)
        l["a"].foo = True
        self.assertEqual(l["a"].foo, True)

        with self.assertRaises(TypeError):
            l["a"].bar = "bar"

        self.assertEqual(l["a"].bar, 0)
        l["a"].bar = 42
        self.assertEqual(l["a"].bar, 42)

        l["b"].foo = True
        self.assertEqual(l["b"].foo, True)

        with self.assertRaises(AttributeError):
            l["b"].baz = False

        l["b"].update(foo=False, bar=12)
        self.assertEqual(l["b"].foo, False)
        self.assertEqual(l["b"].bar, 12)

        with self.assertRaises(AttributeError):
            l["b"].update(xyz=1)
Пример #5
0
    def test_strict_ordering_on_append_list_with_flags_factory_extend(self):
        FooList = StrictOrderingOnAppendListWithFlagsFactory({
            "foo":
            bool,
            "bar":
            six.text_type
        })
        foo = FooList(["a", "b", "c"])
        foo["a"].foo = True
        foo["b"].bar = "bar"

        # Don't allow extending lists with different flag definitions.
        BarList = StrictOrderingOnAppendListWithFlagsFactory({
            "foo": six.text_type,
            "baz": bool
        })
        bar = BarList(["d", "e", "f"])
        bar["d"].foo = "foo"
        bar["e"].baz = True
        with self.assertRaises(ValueError):
            foo + bar
        with self.assertRaises(ValueError):
            bar + foo

        # It's not obvious what to do with duplicate list items with possibly
        # different flag values, so don't allow that case.
        with self.assertRaises(ValueError):
            foo + foo

        def assertExtended(l):
            self.assertEqual(len(l), 6)
            self.assertEqual(l["a"].foo, True)
            self.assertEqual(l["b"].bar, "bar")
            self.assertTrue("c" in l)
            self.assertEqual(l["d"].foo, True)
            self.assertEqual(l["e"].bar, "bar")
            self.assertTrue("f" in l)

        # Test extend.
        zot = FooList(["d", "e", "f"])
        zot["d"].foo = True
        zot["e"].bar = "bar"
        zot.extend(foo)
        assertExtended(zot)

        # Test __add__.
        zot = FooList(["d", "e", "f"])
        zot["d"].foo = True
        zot["e"].bar = "bar"
        assertExtended(foo + zot)
        assertExtended(zot + foo)

        # Test __iadd__.
        foo += zot
        assertExtended(foo)

        # Test __setitem__.
        foo[3:] = []
        self.assertEqual(len(foo), 3)
        foo[3:] = zot
        assertExtended(foo)
Пример #6
0
    def __cmp__(self, other):
        return cmp(self.value, str(other))

    def __hash__(self):
        return hash(self.value)


VARIABLES = {
    'HOGE': (unicode, unicode, None),
    'FUGA': (Fuga, unicode, None),
    'PIYO': (Piyo, unicode, None),
    'HOGERA':
    (ContextDerivedTypedList(Piyo, StrictOrderingOnAppendList), list, None),
    'HOGEHOGE': (ContextDerivedTypedListWithItems(
        Piyo, StrictOrderingOnAppendListWithFlagsFactory({
            'foo': bool,
        })), list, None),
}


class TestContext(unittest.TestCase):
    def test_key_rejection(self):
        # Lowercase keys should be rejected during normal operation.
        ns = Context(allowed_variables=VARIABLES)

        with self.assertRaises(KeyError) as ke:
            ns['foo'] = True

        e = ke.exception.args
        self.assertEqual(e[0], 'global_ns')
        self.assertEqual(e[1], 'set_unknown')
Пример #7
0
        file.
        """, 'export'),
    'ANDROID_RES_DIRS': (List, list, """Android resource directories.

        This variable contains a list of directories, each relative to
        the srcdir, containing static files to package into a 'res'
        directory and merge into an APK file.
        """, 'export'),
    'ANDROID_ECLIPSE_PROJECT_TARGETS':
    (dict, dict, """Defines Android Eclipse project targets.

        This variable should not be populated directly. Instead, it should
        populated by calling add_android_eclipse{_library}_project().
        """, 'export'),
    'SOURCES': (StrictOrderingOnAppendListWithFlagsFactory({
        'no_pgo': bool,
        'flags': List
    }), list, """Source code files.

        This variable contains a list of source code files to compile.
        Accepts assembler, C, C++, Objective C/C++.
        """, None),
    'GENERATED_SOURCES': (StrictOrderingOnAppendList, list,
                          """Generated source code files.

        This variable contains a list of generated source code files to
        compile. Accepts assembler, C, C++, Objective C/C++.
        """, None),
    'FILES_PER_UNIFIED_FILE':
    (int, int,
     """The number of source files to compile into each unified source file.
Пример #8
0
    'ANDROID_RES_DIRS': (list, list,
        """Android resource directories.

        This variable contains a list of directories, each relative to
        the srcdir, containing static files to package into a 'res'
        directory and merge into an APK file.
        """, 'export'),

    'ANDROID_ECLIPSE_PROJECT_TARGETS': (dict, dict,
        """Defines Android Eclipse project targets.

        This variable should not be populated directly. Instead, it should
        populated by calling add_android_eclipse{_library}_project().
        """, 'export'),

    'SOURCES': (StrictOrderingOnAppendListWithFlagsFactory({'no_pgo': bool}), list,
        """Source code files.

        This variable contains a list of source code files to compile.
        Accepts assembler, C, C++, Objective C/C++.
        """, 'compile'),

    'GENERATED_SOURCES': (StrictOrderingOnAppendList, list,
        """Generated source code files.

        This variable contains a list of generated source code files to
        compile. Accepts assembler, C, C++, Objective C/C++.
        """, 'compile'),

    'FILES_PER_UNIFIED_FILE': (int, int,
        """The number of source files to compile into each unified source file.
Пример #9
0
    def __hash__(self):
        return hash(self.value)


VARIABLES = {
    "HOGE": (six.text_type, six.text_type, None),
    "FUGA": (Fuga, six.text_type, None),
    "PIYO": (Piyo, six.text_type, None),
    "HOGERA": (ContextDerivedTypedList(Piyo, StrictOrderingOnAppendList), list, None),
    "HOGEHOGE": (
        ContextDerivedTypedListWithItems(
            Piyo,
            StrictOrderingOnAppendListWithFlagsFactory(
                {
                    "foo": bool,
                }
            ),
        ),
        list,
        None,
    ),
}


class TestContext(unittest.TestCase):
    def test_key_rejection(self):
        # Lowercase keys should be rejected during normal operation.
        ns = Context(allowed_variables=VARIABLES)

        with self.assertRaises(KeyError) as ke:
Пример #10
0
    'ANDROID_GENERATED_RESFILES':
    (StrictOrderingOnAppendList, list,
     """Android resource files generated as part of the build.

        This variable contains a list of files that are expected to be
        generated (often by preprocessing) into a 'res' directory as
        part of the build process, and subsequently merged into an APK
        file.
        """, 'export'),
    'ANDROID_RES_DIRS': (list, list, """Android resource directories.

        This variable contains a list of directories, each relative to
        the srcdir, containing static files to package into a 'res'
        directory and merge into an APK file.
        """, 'export'),
    'SOURCES': (StrictOrderingOnAppendListWithFlagsFactory({'no_pgo': bool}),
                list, """Source code files.

        This variable contains a list of source code files to compile.
        Accepts assembler, C, C++, Objective C/C++.
        """, 'compile'),
    'GENERATED_SOURCES': (StrictOrderingOnAppendList, list,
                          """Generated source code files.

        This variable contains a list of generated source code files to
        compile. Accepts assembler, C, C++, Objective C/C++.
        """, 'compile'),
    'FILES_PER_UNIFIED_FILE':
    (int, int,
     """The number of source files to compile into each unified source file.
Пример #11
0
    'ANDROID_GENERATED_RESFILES':
    (StrictOrderingOnAppendList, list,
     """Android resource files generated as part of the build.

        This variable contains a list of files that are expected to be
        generated (often by preprocessing) into a 'res' directory as
        part of the build process, and subsequently merged into an APK
        file.
        """, 'export'),
    'ANDROID_RES_DIRS': (list, list, """Android resource directories.

        This variable contains a list of directories, each relative to
        the srcdir, containing static files to package into a 'res'
        directory and merge into an APK file.
        """, 'export'),
    'SOURCES': (StrictOrderingOnAppendListWithFlagsFactory({'no_pgo': bool}),
                list, """Source code files.

        This variable contains a list of source code files to compile.
        Accepts assembler, C, C++, Objective C/C++.
        """, 'compile'),
    'GENERATED_SOURCES': (StrictOrderingOnAppendList, list,
                          """Generated source code files.

        This variable contains a list of generated source code files to
        compile. Accepts assembler, C, C++, Objective C/C++.
        """, 'compile'),
    'FILES_PER_UNIFIED_FILE':
    (int, int,
     """The number of source files to compile into each unified source file.