Exemple #1
0
def _prepare_map_meta(args, allow_defaults, defaults=None, elements=None, required=None):
    # prepare some data structures that will be used for the takes MapMeta
    if defaults is None:
        defaults = OrderedDict()
    if elements is None:
        elements = OrderedDict()
    if required is None:
        required = []
    for index in range(0, len(args), 3):
        # pick out 3 arguments
        name = args[index]
        check_camel_case(name)
        meta = args[index + 1]
        default = args[index + 2]
        # store them in the right structures
        elements[name] = meta
        if default is REQUIRED:
            required.append(name)
        elif default is not OPTIONAL:
            assert allow_defaults, "Defaults not allowed in this structure"
            defaults[name] = default

    # Setup the takes MapMeta and attach it to the function's MethodMeta
    meta = MapMeta()
    meta.set_elements(ElementMap(elements))
    meta.set_required(required)
    return meta, defaults
Exemple #2
0
    def recreate_from_others(self, method_metas, without=None):
        if without is None:
            without = []
        defaults = OrderedDict()
        elements = OrderedDict()
        required = []

        # Populate the intermediate data structures
        for method_meta in method_metas:
            for element in method_meta.takes.elements:
                if element not in without:
                    # Serialize it to copy it
                    serialized = method_meta.takes.elements[element].to_dict()
                    elements[element] = serialized
                    if element in method_meta.takes.required and element not in required:
                        required.append(element)
                    if element in method_meta.defaults:
                        defaults.pop(element, None)
                        defaults[element] = method_meta.defaults[element]
                    # TODO: what about returns?

        # remove required args that are now defaulted
        required = [r for r in required if r not in defaults]

        # Update ourself from these structures
        takes = MapMeta()
        takes.set_elements(ElementMap(elements))
        takes.set_required(required)
        self.set_takes(takes)
        self.set_defaults(defaults)
Exemple #3
0
def _prepare_map_meta(args,
                      allow_defaults,
                      defaults=None,
                      elements=None,
                      required=None):
    # prepare some data structures that will be used for the takes MapMeta
    if defaults is None:
        defaults = OrderedDict()
    if elements is None:
        elements = OrderedDict()
    if required is None:
        required = []
    for index in range(0, len(args), 3):
        # pick out 3 arguments
        name = args[index]
        check_camel_case(name)
        meta = args[index + 1]
        default = args[index + 2]
        # store them in the right structures
        elements[name] = meta
        if default is REQUIRED:
            required.append(name)
        elif default is not OPTIONAL:
            assert allow_defaults, \
                "Defaults not allowed in this structure"
            defaults[name] = default

    # Setup the takes MapMeta and attach it to the function's MethodMeta
    meta = MapMeta()
    meta.set_elements(ElementMap(elements))
    meta.set_required(required)
    return meta, defaults
Exemple #4
0
class TestSerialization(unittest.TestCase):
    def setUp(self):
        self.serialized = OrderedDict()
        self.serialized["typeid"] = "malcolm:core/Method:1.0"
        self.takes = MapMeta()
        self.takes.set_elements({"in_attr": StringMeta("desc")})
        self.serialized["takes"] = self.takes.to_dict()
        self.serialized["defaults"] = OrderedDict({"in_attr": "default"})
        self.serialized["description"] = "test_description"
        self.serialized["tags"] = ()
        self.serialized["writeable"] = True
        self.serialized["label"] = ""
        self.serialized["returns"] = MapMeta().to_dict()

    def test_to_dict(self):
        m = MethodModel("test_description")
        m.set_takes(self.takes)
        m.set_defaults(self.serialized["defaults"])
        assert m.to_dict() == self.serialized

    def test_from_dict(self):
        m = MethodModel.from_dict(self.serialized)
        assert m.takes.to_dict() == self.takes.to_dict()
        assert m.defaults == self.serialized["defaults"]
        assert m.tags == ()
        assert m.writeable == True
        assert m.label == ""
        assert m.returns.to_dict() == MapMeta().to_dict()
class TestSerialization(unittest.TestCase):

    def setUp(self):
        self.serialized = OrderedDict()
        self.serialized["typeid"] = "malcolm:core/MethodMeta:1.0"
        self.takes = MapMeta()
        self.takes.set_elements(ElementMap({"in_attr": StringMeta("desc")}))
        self.serialized["takes"] = self.takes.to_dict()
        self.serialized["defaults"] = OrderedDict({"in_attr": "default"})
        self.serialized["description"] = "test_description"
        self.serialized["tags"] = []
        self.serialized["writeable"] = True
        self.serialized["label"] = ""
        self.serialized["returns"] = MapMeta().to_dict()

    def test_to_dict(self):
        m = MethodMeta("test_description")
        m.set_takes(self.takes)
        m.set_defaults(self.serialized["defaults"])
        self.assertEqual(m.to_dict(), self.serialized)

    def test_from_dict(self):
        m = MethodMeta.from_dict(self.serialized.copy())
        self.assertEqual(m.takes.to_dict(), self.takes.to_dict())
        self.assertEqual(m.defaults, self.serialized["defaults"])
        self.assertEqual(m.tags, [])
        self.assertEqual(m.writeable, True)
        self.assertEqual(m.label, "")
        self.assertEqual(m.returns.to_dict(), MapMeta().to_dict())
Exemple #6
0
    def recreate_from_others(self, method_metas, without=None):
        if without is None:
            without = []
        defaults = OrderedDict()
        elements = OrderedDict()
        required = []

        # Populate the intermediate data structures
        for method_meta in method_metas:
            for element in method_meta.takes.elements:
                if element not in without:
                    # Serialize it to copy it
                    serialized = method_meta.takes.elements[element].to_dict()
                    elements[element] = serialized
                    if element in method_meta.takes.required and \
                                    element not in required:
                        required.append(element)
                    if element in method_meta.defaults:
                        defaults.pop(element, None)
                        defaults[element] = method_meta.defaults[element]
                    # TODO: what about returns?

        # remove required args that are now defaulted
        required = [r for r in required if r not in defaults]

        # Update ourself from these structures
        takes = MapMeta()
        takes.set_elements(ElementMap(elements))
        takes.set_required(required)
        self.set_takes(takes)
        self.set_defaults(defaults)
Exemple #7
0
class TestSerialization(unittest.TestCase):
    def setUp(self):
        self.serialized = OrderedDict()
        self.serialized["typeid"] = "malcolm:core/Method:1.0"
        self.takes = MapMeta()
        self.takes.set_elements(OrderedDict({"in_attr": StringMeta("desc")}))
        self.serialized["takes"] = self.takes.to_dict()
        self.serialized["defaults"] = OrderedDict({"in_attr": "default"})
        self.serialized["description"] = "test_description"
        self.serialized["tags"] = []
        self.serialized["writeable"] = True
        self.serialized["label"] = ""
        self.serialized["returns"] = MapMeta().to_dict()

    def test_to_dict(self):
        m = Method("test_description")
        m.set_takes(self.takes)
        m.set_defaults(self.serialized["defaults"])
        self.assertEqual(m.to_dict(), self.serialized)

    def test_from_dict(self):
        m = Method.from_dict(self.serialized.copy())
        self.assertEqual(m.takes.to_dict(), self.takes.to_dict())
        self.assertEqual(m.defaults, self.serialized["defaults"])
        self.assertEqual(m.tags, [])
        self.assertEqual(m.writeable, True)
        self.assertEqual(m.label, "")
        self.assertEqual(m.returns.to_dict(), MapMeta().to_dict())
Exemple #8
0
    def test_recreate(self):
        @method_takes(
            "arg1",
            StringMeta("Arg1"),
            REQUIRED,
            "extra",
            StringMeta(),
            REQUIRED,
        )
        def method1():
            pass

        @method_takes(
            "arg8",
            StringMeta("Arg8"),
            REQUIRED,
            "arg3",
            StringMeta("Arg3"),
            "32",
            "arg4",
            StringMeta("Arg4"),
            OPTIONAL,
        )
        def method2():
            pass

        @method_takes(
            "arg8",
            StringMeta("Arg8"),
            "2",
            "arg3",
            StringMeta("Arg3"),
            "33",
        )
        def method3():
            pass

        m = MethodModel("Test")
        m.recreate_from_others(
            [method1.MethodModel, method2.MethodModel, method3.MethodModel],
            without=["extra"])

        itakes = MapMeta()
        elements = OrderedDict()
        elements["arg1"] = StringMeta("Arg1")
        elements["arg8"] = StringMeta("Arg8")
        elements["arg3"] = StringMeta("Arg3")
        elements["arg4"] = StringMeta("Arg4")
        itakes.set_elements(elements)
        itakes.set_required(["arg1"])
        defaults = OrderedDict()
        defaults["arg8"] = "2"
        defaults["arg3"] = "33"
        assert m.takes.to_dict() == itakes.to_dict()
        assert m.returns.to_dict() == MapMeta().to_dict()
        assert m.defaults == defaults
Exemple #9
0
    def test_takes_given_optional(self):
        @takes("hello", StringMeta(), OPTIONAL)
        def say_hello(params):
            """Say hello"""
            print("Hello" + params.name)

        itakes = MapMeta()
        itakes.set_elements(OrderedDict(hello=StringMeta()))
        self.assertEqual(say_hello.Method.takes.to_dict(), itakes.to_dict())
        self.assertEqual(say_hello.Method.returns.to_dict(), MapMeta().to_dict())
        self.assertEqual(say_hello.Method.defaults, {})
Exemple #10
0
    def test_takes_given_defaults(self):
        @method_takes("hello", StringMeta(), "Something")
        def say_hello(params):
            """Say hello"""
            print("Hello" + params.name)

        itakes = MapMeta()
        itakes.set_elements(OrderedDict(hello=StringMeta()))
        assert say_hello.MethodModel.takes.to_dict() == itakes.to_dict()
        assert say_hello.MethodModel.returns.to_dict() == MapMeta().to_dict()
        assert say_hello.MethodModel.defaults == {"hello": "Something"}
    def test_takes_given_defaults(self):
        @method_takes("hello", StringMeta(), "Something")
        def say_hello(params):
            """Say hello"""
            print("Hello" + params.name)

        itakes = MapMeta()
        itakes.set_elements(ElementMap(OrderedDict(hello=StringMeta())))
        self.assertEqual(say_hello.MethodMeta.takes.to_dict(), itakes.to_dict())
        self.assertEqual(say_hello.MethodMeta.returns.to_dict(), MapMeta().to_dict())
        self.assertEqual(say_hello.MethodMeta.defaults, {"hello": "Something"})
Exemple #12
0
    def test_takes_given_defaults(self):
        @takes("hello", StringMeta(), "Something")
        def say_hello(params):
            """Say hello"""
            print("Hello" + params.name)

        itakes = MapMeta()
        itakes.set_elements(OrderedDict(hello=StringMeta()))
        self.assertEqual(say_hello.Method.takes.to_dict(), itakes.to_dict())
        self.assertEqual(say_hello.Method.returns.to_dict(),
                         MapMeta().to_dict())
        self.assertEqual(say_hello.Method.defaults, {"hello": "Something"})
Exemple #13
0
    def test_takes_given_required(self):
        @method_takes("hello", StringMeta(), REQUIRED)
        def say_hello(params):
            """Say hello"""
            print("Hello" + params.name)

        itakes = MapMeta()
        itakes.set_elements(OrderedDict(hello=StringMeta()))
        itakes.set_required(["hello"])
        assert say_hello.MethodModel.takes.to_dict() == itakes.to_dict()
        assert say_hello.MethodModel.returns.to_dict() == MapMeta().to_dict()
        assert say_hello.MethodModel.defaults == {}
Exemple #14
0
    def test_takes_given_required(self):
        @takes("hello", StringMeta(), REQUIRED)
        def say_hello(params):
            """Say hello"""
            print("Hello" + params.name)

        itakes = MapMeta()
        itakes.set_elements(OrderedDict(hello=StringMeta()))
        itakes.set_required(["hello"])
        self.assertEqual(say_hello.Method.takes.to_dict(), itakes.to_dict())
        self.assertEqual(say_hello.Method.returns.to_dict(),
                         MapMeta().to_dict())
        self.assertEqual(say_hello.Method.defaults, {})
    def test_returns_given_valid_sets(self):
        @method_returns("hello", StringMeta(), REQUIRED)
        def say_hello(ret):
            """Say hello"""
            ret.hello = "Hello"
            return ret

        ireturns = MapMeta()
        ireturns.set_elements(ElementMap(OrderedDict(hello=StringMeta())))
        ireturns.set_required(["hello"])
        self.assertEqual(say_hello.MethodMeta.takes.to_dict(), MapMeta().to_dict())
        self.assertEqual(say_hello.MethodMeta.returns.to_dict(), ireturns.to_dict())
        self.assertEqual(say_hello.MethodMeta.defaults, {})
Exemple #16
0
    def test_returns_given_valid_sets(self):
        @method_returns("hello", StringMeta(), REQUIRED)
        def say_hello(ret):
            """Say hello"""
            ret.hello = "Hello"
            return ret

        ireturns = MapMeta()
        ireturns.set_elements(OrderedDict(hello=StringMeta()))
        ireturns.set_required(["hello"])
        assert say_hello.MethodModel.takes.to_dict() == MapMeta().to_dict()
        assert say_hello.MethodModel.returns.to_dict() == ireturns.to_dict()
        assert say_hello.MethodModel.defaults == {}
Exemple #17
0
    def test_takes_given_optional(self):
        @method_takes("hello", StringMeta(), OPTIONAL)
        def say_hello(params):
            """Say hello"""
            print("Hello" + params.name)

        itakes = MapMeta()
        itakes.set_elements(ElementMap(OrderedDict(hello=StringMeta())))
        self.assertEqual(say_hello.MethodMeta.takes.to_dict(),
                         itakes.to_dict())
        self.assertEqual(say_hello.MethodMeta.returns.to_dict(),
                         MapMeta().to_dict())
        self.assertEqual(say_hello.MethodMeta.defaults, {})
Exemple #18
0
    def test_returns_given_valid_sets(self):
        @returns("hello", StringMeta(), REQUIRED)
        def say_hello(ret):
            """Say hello"""
            ret.hello = "Hello"
            return ret

        ireturns = MapMeta()
        ireturns.set_elements(OrderedDict(hello=StringMeta()))
        ireturns.set_required(["hello"])
        self.assertEqual(say_hello.Method.takes.to_dict(), MapMeta().to_dict())
        self.assertEqual(say_hello.Method.returns.to_dict(),
                         ireturns.to_dict())
        self.assertEqual(say_hello.Method.defaults, {})
Exemple #19
0
    def test_to_dict(self):
        s = StringMeta(description="a string")
        meta = MapMeta()
        elements = OrderedDict()
        elements["b"] = s
        elements["c"] = s
        elements["d"] = NumberMeta("int32")
        elements["e"] = s
        meta.set_elements(elements)
        m = Map(meta, {"b": "test", "d": 123, "e": "e"})

        expected = OrderedDict()
        expected["typeid"] = "malcolm:core/Map:1.0"
        expected["b"] = "test"
        expected["d"] = 123
        expected["e"] = "e"
        assert expected == m.to_dict()
Exemple #20
0
class TestSetters(unittest.TestCase):
    def setUp(self):
        self.mm = MapMeta("description")

    def test_values_set(self):
        self.assertIsInstance(self.mm.elements, OrderedDict)
        self.assertEqual(self.mm.elements, {})
        self.assertEqual(self.mm.typeid, "malcolm:core/MapMeta:1.0")
        self.assertEqual(self.mm.description, "description")

    def test_set_elements(self):
        els = dict(sam=StringArrayMeta())
        self.mm.set_elements(els)
        self.assertEqual(self.mm.elements, els)

    def test_set_required(self):
        req = ["ddd", "2"]
        self.mm.set_required(req)
        self.assertEqual(self.mm.required, req)
Exemple #21
0
    def test_method_also_takes(self):
        @method_takes("hello", StringMeta(), REQUIRED, "hello2", BooleanMeta(),
                      False)
        class Thing(object):
            pass

        @method_also_takes("world", BooleanMeta(), REQUIRED, "hello2",
                           BooleanMeta(), True, "default", StringMeta(),
                           "nothing")
        class Thing2(Thing):
            pass

        # Check original hasn't been modified
        itakes = MapMeta()
        elements = OrderedDict()
        elements["hello"] = StringMeta()
        elements["hello2"] = BooleanMeta()
        itakes.set_elements(ElementMap(elements))
        itakes.set_required(["hello"])
        defaults = OrderedDict()
        defaults["hello2"] = False
        self.assertEqual(Thing.MethodMeta.takes.to_dict(), itakes.to_dict())
        self.assertEqual(Thing.MethodMeta.returns.to_dict(),
                         MapMeta().to_dict())
        self.assertEqual(Thing.MethodMeta.defaults, defaults)

        # Check new one overrides/improves on original
        itakes = MapMeta()
        elements = OrderedDict()
        elements["hello"] = StringMeta()
        elements["hello2"] = BooleanMeta()
        elements["world"] = BooleanMeta()
        elements["default"] = StringMeta()
        itakes.set_elements(ElementMap(elements))
        itakes.set_required(["hello", "world"])
        defaults = OrderedDict()
        defaults["hello2"] = True
        defaults["default"] = "nothing"
        self.assertEqual(Thing2.MethodMeta.takes.to_dict(), itakes.to_dict())
        self.assertEqual(Thing2.MethodMeta.returns.to_dict(),
                         MapMeta().to_dict())
        self.assertEqual(Thing2.MethodMeta.defaults, defaults)
    def test_method_also_takes(self):
        @method_takes(
            "hello", StringMeta(), REQUIRED,
            "hello2", BooleanMeta(), False)
        class Thing(object):
            pass

        @method_also_takes(
            "world", BooleanMeta(), REQUIRED,
            "hello2", BooleanMeta(), True,
            "default", StringMeta(), "nothing")
        class Thing2(Thing):
            pass

        # Check original hasn't been modified
        itakes = MapMeta()
        elements = OrderedDict()
        elements["hello"] = StringMeta()
        elements["hello2"] = BooleanMeta()
        itakes.set_elements(ElementMap(elements))
        itakes.set_required(["hello"])
        defaults = OrderedDict()
        defaults["hello2"] = False
        self.assertEqual(Thing.MethodMeta.takes.to_dict(), itakes.to_dict())
        self.assertEqual(Thing.MethodMeta.returns.to_dict(), MapMeta().to_dict())
        self.assertEqual(Thing.MethodMeta.defaults, defaults)

        # Check new one overrides/improves on original
        itakes = MapMeta()
        elements = OrderedDict()
        elements["hello"] = StringMeta()
        elements["hello2"] = BooleanMeta()
        elements["world"] = BooleanMeta()
        elements["default"] = StringMeta()
        itakes.set_elements(ElementMap(elements))
        itakes.set_required(["hello", "world"])
        defaults = OrderedDict()
        defaults["hello2"] = True
        defaults["default"] = "nothing"
        self.assertEqual(Thing2.MethodMeta.takes.to_dict(), itakes.to_dict())
        self.assertEqual(Thing2.MethodMeta.returns.to_dict(), MapMeta().to_dict())
        self.assertEqual(Thing2.MethodMeta.defaults, defaults)
    def test_recreate(self):
        @method_takes(
            "arg1", StringMeta("Arg1"), REQUIRED,
            "extra", StringMeta(), REQUIRED,
        )
        def method1():
            pass

        @method_takes(
            "arg8", StringMeta("Arg8"), REQUIRED,
            "arg3", StringMeta("Arg3"), "32",
            "arg4", StringMeta("Arg4"), OPTIONAL,
        )
        def method2():
            pass

        @method_takes(
            "arg8", StringMeta("Arg8"), "2",
            "arg3", StringMeta("Arg3"), "33",
        )
        def method3():
            pass

        m = MethodMeta("Test")
        m.recreate_from_others([
            method1.MethodMeta, method2.MethodMeta, method3.MethodMeta],
            without=["extra"])

        itakes = MapMeta()
        elements = OrderedDict()
        elements["arg1"] = StringMeta("Arg1")
        elements["arg8"] = StringMeta("Arg8")
        elements["arg3"] = StringMeta("Arg3")
        elements["arg4"] = StringMeta("Arg4")
        itakes.set_elements(ElementMap(elements))
        itakes.set_required(["arg1"])
        defaults = OrderedDict()
        defaults["arg8"] = "2"
        defaults["arg3"] = "33"
        self.assertEqual(m.takes.to_dict(), itakes.to_dict())
        self.assertEqual(m.returns.to_dict(), MapMeta().to_dict())
        self.assertEqual(m.defaults, defaults)
class TestSetters(unittest.TestCase):
    def setUp(self):
        self.mm = MapMeta("description")

    def test_values_set(self):
        self.assertIsInstance(self.mm.elements, ElementMap)
        self.assertEqual(len(self.mm.elements), 0)
        self.assertEqual(self.mm.typeid, "malcolm:core/MapMeta:1.0")
        self.assertEqual(self.mm.description, "description")

    def test_set_elements(self):
        els = ElementMap(dict(sam=StringArrayMeta()))
        self.mm.set_elements(els)
        self.assertEqual(self.mm.elements, els)

    def test_set_required(self):
        self.test_set_elements()
        req = ["sam"]
        self.mm.set_required(req)
        self.assertEqual(self.mm.required, req)
Exemple #25
0
    def test_method_also_takes(self):
        @method_takes("hello", StringMeta(), REQUIRED, "hello2", BooleanMeta(),
                      False)
        class Thing(object):
            def __init__(self):
                pass

        @method_also_takes("world", BooleanMeta(), REQUIRED, "hello2",
                           BooleanMeta(), True, "default", StringMeta(),
                           "nothing")
        class Thing2(Thing):
            pass

        # Check original hasn't been modified
        itakes = MapMeta()
        elements = OrderedDict()
        elements["hello"] = StringMeta()
        elements["hello2"] = BooleanMeta()
        itakes.set_elements(elements)
        itakes.set_required(["hello"])
        defaults = OrderedDict()
        defaults["hello2"] = False
        assert Thing.MethodModel.takes.to_dict() == itakes.to_dict()
        assert Thing.MethodModel.returns.to_dict() == MapMeta().to_dict()
        assert Thing.MethodModel.defaults == defaults

        # Check new one overrides/improves on original
        itakes = MapMeta()
        elements = OrderedDict()
        elements["hello"] = StringMeta()
        elements["hello2"] = BooleanMeta()
        elements["world"] = BooleanMeta()
        elements["default"] = StringMeta()
        itakes.set_elements(elements)
        itakes.set_required(["hello", "world"])
        defaults = OrderedDict()
        defaults["hello2"] = True
        defaults["default"] = "nothing"
        assert Thing2.MethodModel.takes.to_dict() == itakes.to_dict()
        assert Thing2.MethodModel.returns.to_dict() == MapMeta().to_dict()
        assert Thing2.MethodModel.defaults == defaults
Exemple #26
0
class TestSetters(unittest.TestCase):

    def setUp(self):
        self.mm = MapMeta("description")

    def test_values_set(self):
        self.assertIsInstance(self.mm.elements, dict)
        assert len(self.mm.elements) == 0
        assert self.mm.typeid == "malcolm:core/MapMeta:1.0"
        assert self.mm.description == "description"

    def test_set_elements(self):
        els = dict(sam=StringArrayMeta())
        self.mm.set_elements(els)
        assert self.mm.elements == els

    def test_set_required(self):
        self.test_set_elements()
        req = ("sam",)
        self.mm.set_required(req)
        assert self.mm.required == req
class TestSetters(unittest.TestCase):

    def setUp(self):
        self.mm = MapMeta("description")

    def test_values_set(self):
        self.assertIsInstance(self.mm.elements, ElementMap)
        self.assertEqual(len(self.mm.elements), 0)
        self.assertEqual(self.mm.typeid, "malcolm:core/MapMeta:1.0")
        self.assertEqual(self.mm.description, "description")

    def test_set_elements(self):
        els = ElementMap(dict(sam=StringArrayMeta()))
        self.mm.set_elements(els)
        self.assertEqual(self.mm.elements, els)

    def test_set_required(self):
        self.test_set_elements()
        req = ["sam"]
        self.mm.set_required(req)
        self.assertEqual(self.mm.required, req)
Exemple #28
0
    def test_incomplete_return(self):
        func = Mock(return_value={"output1": 2})
        m = Method("test_description", writeable=True)
        m.name = "test_method"
        m.set_function(func)
        s = StringMeta(description='desc')
        args_meta = MapMeta()
        args_meta.set_elements({"first": s, "second": s})
        return_meta = MapMeta()
        return_meta.set_elements({"output1": s, "output2": s})
        return_meta.set_required(["output2"])
        m.set_takes(args_meta)
        m.set_returns(return_meta)

        with self.assertRaises(KeyError):
            m.call_function(dict(first=1, second=2))
        call_arg1, call_arg2 = func.call_args_list[0][0]
        self.assertEqual('1', call_arg1.first)
        self.assertEqual('2', call_arg1.second)
        self.assertEqual(args_meta, call_arg1.meta)
        self.assertEqual(return_meta, call_arg2.meta)
Exemple #29
0
    def test_incomplete_return(self):
        func = Mock(return_value={"output1": 2})
        m = Method("test_description", writeable=True)
        m.name = "test_method"
        m.set_function(func)
        s = StringMeta(description='desc')
        args_meta = MapMeta()
        args_meta.set_elements({"first": s, "second": s})
        return_meta = MapMeta()
        return_meta.set_elements({"output1": s, "output2": s})
        return_meta.set_required(["output2"])
        m.set_takes(args_meta)
        m.set_returns(return_meta)

        with self.assertRaises(KeyError):
            m.call_function(dict(first=1, second=2))
        call_arg1, call_arg2 = func.call_args_list[0][0]
        self.assertEqual('1', call_arg1.first)
        self.assertEqual('2', call_arg1.second)
        self.assertEqual(args_meta, call_arg1.meta)
        self.assertEqual(return_meta, call_arg2.meta)
Exemple #30
0
class TestMap(unittest.TestCase):
    def setUp(self):
        n = NumberMeta(description='a number')
        s = StringMeta(description="a string")
        self.meta = MapMeta()
        self.meta.set_elements({"a": s, "b": s})
        self.meta.set_required(["a"])
        self.nmeta = MapMeta()
        self.nmeta.set_elements({"a": n, "b": n})
        self.nmeta.set_required(["a"])

    def test_init(self):
        b_mock = MagicMock()
        m = Map(self.meta, {"a": "test", "b": b_mock})
        assert self.meta == m.meta
        assert "test" == m.a
        self.assertIs(str(b_mock), m.b)
        assert "malcolm:core/Map:1.0" == m.typeid

    def test_init_raises_on_bad_key(self):
        with self.assertRaises(ValueError):
            m = Map(self.meta, {"bad_key": MagicMock()})

    def test_empty_init(self):
        m = Map(self.meta, None)
        assert self.meta == m.meta
        with self.assertRaises(AttributeError):
            m.a

    def test_to_dict(self):
        s = StringMeta(description="a string")
        meta = MapMeta()
        elements = OrderedDict()
        elements["b"] = s
        elements["c"] = s
        elements["d"] = NumberMeta("int32")
        elements["e"] = s
        meta.set_elements(elements)
        m = Map(meta, {"b": "test", "d": 123, "e": "e"})

        expected = OrderedDict()
        expected["typeid"] = "malcolm:core/Map:1.0"
        expected["b"] = "test"
        expected["d"] = 123
        expected["e"] = "e"
        assert expected == m.to_dict()

    def test_from_dict(self):
        map_meta = MagicMock()
        map_meta.elements = {"a": Mock(), "b": Mock(), "c": Mock()}
        map_meta.elements["a"].validate.return_value = 124
        map_meta.elements["b"].validate.return_value = "Something"
        map_meta.required = ["a"]

        d = {"a": 123, "b": {"typeid": "mock_typeid"}}
        m = Map(map_meta, d)
        assert 124 == m.a
        assert "Something" == m.b

    def test_equals_maps(self):
        self.meta.to_dict = MagicMock()
        m1 = Map(self.meta, {"a": "test"})
        m2 = Map(self.meta, {"a": "test2"})
        assert not m1 == m2
        assert m1 != m2
        m2.a = "test"
        assert m1 == m2
        assert not m1 != m2

        m2 = Map(self.meta, {"a": "test", "b": "test"})
        assert not m1 == m2
        m1["b"] = "test"
        assert m1 == m2

        s = StringMeta(description="a string")
        meta2 = Meta()
        meta2.elements = {"a": s, "b": s}
        meta2.required = ["a"]
        meta2.to_dict = self.meta.to_dict
        m2 = Map(meta2, {"a": "test", "b": "test"})
        assert m1 == m2

    def test_equals_dicts(self):
        m = Map(self.meta, {"a": "test"})
        d = {"a": "test"}
        assert m == d
        assert not m != d

        m["b"] = "test"
        assert not m == d
        assert m != d

        d["b"] = "test2"
        assert not m == d
        assert m != d

        d["b"] = "test"
        assert m == d
        assert not m != d

    def test_contains(self):
        m = Map(self.meta, {"a": "test"})
        assert "a" in m
        assert not "b" in m
        assert not "__init__" in m

    def test_get_item(self):
        m = Map(self.meta, {"a": "test"})
        assert "test" == m["a"]
        m.a = "test_2"
        assert "test_2" == m["a"]

    def test_get_item_raises_if_no_key(self):
        m = Map(self.meta, {"a": "test"})
        with self.assertRaises(KeyError):
            m["b"]

    def test_get_item_fails_if_non_key(self):
        m = Map(self.meta)
        with self.assertRaises(KeyError):
            m["__init__"]

    def test_set_item(self):
        m = Map(self.meta, {"a": 1})
        a_mock = MagicMock()
        b_mock = MagicMock()
        m["a"] = a_mock
        m["b"] = b_mock
        assert str(a_mock) == m.a
        assert str(b_mock) == m.b

    def test_set_item_raises_invalid_key(self):
        m = Map(self.meta)
        with self.assertRaises(ValueError):
            m["c"] = MagicMock()

    def test_len(self):
        m = Map(self.meta)
        assert 0 == len(m)
        m.a = 1
        assert 1 == len(m)
        m.b = 1
        assert 2 == len(m)

    def test_iter(self):
        m = Map(self.meta, {"a": "x", "b": "y"})
        assert {"a", "b"} == {x for x in m}

    def test_update(self):
        m = Map(self.nmeta, {"a": 1})
        d = {"a": 2, "b": 2}
        m.update(d)
        assert 2 == m.a
        assert 2 == m.b

    def test_update_raises_on_invalid_key(self):
        m = Map(self.nmeta, {"a": 1})
        d = {"a": 2, "b": 2, "c": 2}
        with self.assertRaises(ValueError):
            m.update(d)
        assert 1 == m.a
        with self.assertRaises(AttributeError):
            m.b
        with self.assertRaises(AttributeError):
            m.c

    def test_clear(self):
        m = Map(self.nmeta, {"a": 1})
        m.clear()
        with self.assertRaises(AttributeError):
            m.a

    def test_keys(self):
        m = Map(self.nmeta, {"a": 1})
        assert ["a"] == list(m.keys())
        m.b = 1
        assert {"a", "b"} == set(m.keys())

    def test_values(self):
        m = Map(self.nmeta, {"a": 1})
        assert [1] == list(m.values())
        m.b = 2
        assert {1, 2} == set(m.values())

    def test_items(self):
        m = Map(self.nmeta, {"b": 2})
        assert [("b", 2)] == list(m.items())
        m.a = 1
        assert {("a", 1), ("b", 2)} == set(m.items())

    def test_repr(self):
        m = Map(self.nmeta, {"b": 44})
        r = repr(m)
        assert r == "Map({'b': 44.0})"
Exemple #31
0
 def test_to_dict(self):
     tm = MapMeta("desc")
     tm.set_elements(dict(c1=self.sam))
     tm.set_required(["c1"])
     self.assertEqual(tm.to_dict(), self.serialized)
 def test_to_dict(self):
     tm = MapMeta("desc")
     tm.set_elements(ElementMap(dict(c1=self.sam)))
     tm.set_required(["c1"])
     self.assertEqual(tm.to_dict(), self.serialized)
class TestMap(unittest.TestCase):

    def setUp(self):
        n = NumberMeta(description='a number')
        s = StringMeta(description="a string")
        self.meta = MapMeta()
        self.meta.set_elements(ElementMap({"a": s, "b": s}))
        self.meta.set_required(["a"])
        self.nmeta = MapMeta()
        self.nmeta.set_elements(ElementMap({"a": n, "b": n}))
        self.nmeta.set_required(["a"])

    def test_init(self):
        b_mock = MagicMock()
        m = Map(self.meta, {"a":"test", "b":b_mock})
        self.assertEqual(self.meta, m.meta)
        self.assertEqual("test", m.a)
        self.assertIs(str(b_mock), m.b)
        self.assertEqual("malcolm:core/Map:1.0", m.typeid)

    def test_init_raises_on_bad_key(self):
        with self.assertRaises(ValueError):
            m = Map(self.meta, {"bad_key":MagicMock()})

    def test_empty_init(self):
        m = Map(self.meta, None)
        self.assertEqual(self.meta, m.meta)
        with self.assertRaises(AttributeError):
            m.a

    def test_to_dict(self):
        a_mock = MagicMock()
        s = StringMeta(description="a string")
        meta = Meta()
        meta.elements = OrderedDict()
        meta.elements["b"] = s
        meta.elements["c"] = s
        meta.elements["d"] = NumberMeta("int32")
        meta.elements["e"] = s
        m = Map(meta, {"b":"test", "d":123, "e":"e"})

        expected = OrderedDict()
        expected["typeid"] = "malcolm:core/Map:1.0"
        expected["b"] = "test"
        expected["d"] = 123
        expected["e"] = "e"
        self.assertEquals(expected, m.to_dict())

    def test_from_dict(self):
        map_meta = MagicMock()
        map_meta.elements = {"a": Mock(), "b": Mock(), "c": Mock()}
        map_meta.elements["a"].validate.return_value = 124
        map_meta.elements["b"].validate.return_value = "Something"
        map_meta.required = ["a"]

        d = {"a":123, "b":{"typeid":"mock_typeid"}}
        m = Map(map_meta, d)
        self.assertEquals(124, m.a)
        self.assertEquals("Something", m.b)

    def test_equals_maps(self):
        self.meta.to_dict = MagicMock()
        m1 = Map(self.meta, {"a":"test"})
        m2 = Map(self.meta, {"a":"test2"})
        self.assertFalse(m1 == m2)
        self.assertTrue(m1 != m2)
        m2.a = "test"
        self.assertTrue(m1 == m2)
        self.assertFalse(m1 != m2)

        m2 = Map(self.meta, {"a":"test", "b":"test"})
        self.assertFalse(m1 == m2)
        m1["b"] = "test"
        self.assertTrue(m1 == m2)

        s = StringMeta(description="a string")
        meta2 = Meta()
        meta2.elements = {"a":s, "b":s}
        meta2.required = ["a"]
        meta2.to_dict = self.meta.to_dict
        m2 = Map(meta2, {"a":"test", "b":"test"})
        self.assertTrue(m1 == m2)

    def test_equals_dicts(self):
        m = Map(self.meta, {"a":"test"})
        d = {"a":"test"}
        self.assertTrue(m == d)
        self.assertFalse(m != d)

        m["b"] = "test"
        self.assertFalse(m == d)
        self.assertTrue(m != d)

        d["b"] = "test2"
        self.assertFalse(m == d)
        self.assertTrue(m != d)

        d["b"] = "test"
        self.assertTrue(m == d)
        self.assertFalse(m != d)

    def test_contains(self):
        m = Map(self.meta, {"a":"test"})
        self.assertTrue("a" in m)
        self.assertFalse("b" in m)
        self.assertFalse("__init__" in m)

    def test_get_item(self):
        m = Map(self.meta, {"a":"test"})
        self.assertEqual("test", m["a"])
        m.a = "test_2"
        self.assertEqual("test_2", m["a"])

    def test_get_item_raises_if_no_key(self):
        m = Map(self.meta, {"a":"test"})
        with self.assertRaises(KeyError):
            m["b"]

    def test_get_item_fails_if_non_key(self):
        m = Map(self.meta)
        with self.assertRaises(KeyError):
            m["__init__"]

    def test_set_item(self):
        m = Map(self.meta, {"a":1})
        a_mock = MagicMock()
        b_mock = MagicMock()
        m["a"] = a_mock
        m["b"] = b_mock
        self.assertEqual(str(a_mock), m.a)
        self.assertEqual(str(b_mock), m.b)

    def test_set_item_raises_invalid_key(self):
        m = Map(self.meta)
        with self.assertRaises(ValueError):
            m["c"] = MagicMock()

    def test_len(self):
        m = Map(self.meta)
        self.assertEqual(0, len(m))
        m.a = 1
        self.assertEqual(1, len(m))
        m.b = 1
        self.assertEqual(2, len(m))

    def test_iter(self):
        m = Map(self.meta, {"a":"x", "b":"y"})
        self.assertEqual({"a", "b"}, {x for x in m})

    def test_update(self):
        m = Map(self.nmeta, {"a":1})
        d = {"a":2, "b":2}
        m.update(d)
        self.assertEqual(2, m.a)
        self.assertEqual(2, m.b)

    def test_update_raises_on_invalid_key(self):
        m = Map(self.nmeta, {"a":1})
        d = {"a":2, "b":2, "c":2}
        with self.assertRaises(ValueError):
            m.update(d)
        self.assertEqual(1, m.a)
        with self.assertRaises(AttributeError):
            m.b
        with self.assertRaises(AttributeError):
            m.c

    def test_clear(self):
        m = Map(self.nmeta, {"a":1})
        m.clear()
        with self.assertRaises(AttributeError):
            m.a

    def test_keys(self):
        m = Map(self.nmeta, {"a": 1})
        self.assertEqual(["a"], list(m.keys()))
        m.b = 1
        self.assertEqual({"a", "b"}, set(m.keys()))

    def test_values(self):
        m = Map(self.nmeta, {"a":1})
        self.assertEqual([1], list(m.values()))
        m.b = 2
        self.assertEqual({1, 2}, set(m.values()))

    def test_items(self):
        m = Map(self.nmeta, {"b":2})
        self.assertEqual([("b", 2)], list(m.items()))
        m.a = 1
        self.assertEqual({("a", 1), ("b", 2)}, set(m.items()))

    def test_repr(self):
        m = Map(self.nmeta, {"b": 44})
        r = repr(m)
        self.assertEqual(r, "Map({'b': 44.0})")