Esempio n. 1
0
    def test_contains(self):
        sec = Section(name="root")

        subsec = Section(name="subsec", type="test")
        prop = Property(name="prop")

        # Test not contains on empty child-lists.
        self.assertIsNone(sec.contains(subsec))
        self.assertIsNone(sec.contains(prop))

        # Test contains of Section and Property
        subsec.parent = sec
        simisec = Section(name="subsec", type="test")
        self.assertEqual(sec.contains(simisec).name, subsec.name)

        prop.parent = sec
        simiprop = Property(name="prop")
        self.assertEqual(sec.contains(simiprop).name, prop.name)

        # Test not contains on mismatching Section name/type and Property name
        self.assertIsNone(sec.contains(Section(name="subsec", type="typetest")))
        self.assertIsNone(sec.contains(Section(name="typesec", type="test")))
        self.assertIsNone(sec.contains(Property(name="prop_two")))

        # Test fail on non-Section/Property objects
        with self.assertRaises(ValueError):
            sec.contains(Document())

        with self.assertRaises(ValueError):
            sec.contains("some info")
Esempio n. 2
0
    def test_get_path(self):
        doc = Document()
        sec = Section(name="parent", parent=doc)

        # Check root path for a detached Property.
        prop = Property(name="prop")
        self.assertEqual("/", prop.get_path())

        # Check absolute path of Property in a Document.
        prop.parent = sec
        self.assertEqual("/%s:%s" % (sec.name, prop.name), prop.get_path())
Esempio n. 3
0
 def assign_dummy_properties(section):
     for j in range(randint(1, 2)):
         p = Property(name="prop %d" % j, value="value %d" % j)
         p._section = section
         v = p.value
         if session:
             p = session.set(p)
             v._property = p
             v = session.set(v)
         section.append(p)
         metadata["property"].append(p)
         metadata["value"].append(v)
Esempio n. 4
0
    def test_id(self):
        p = Property(name="P")
        self.assertIsNotNone(p.id)

        p = Property("P", oid="79b613eb-a256-46bf-84f6-207df465b8f7")
        self.assertEqual(p.id, "79b613eb-a256-46bf-84f6-207df465b8f7")

        p = Property("P", oid="id")
        self.assertNotEqual(p.id, "id")

        # Make sure id cannot be reset programmatically.
        with self.assertRaises(AttributeError):
            p.id = "someId"
Esempio n. 5
0
    def test_bool_conversion(self):

        p = Property(name='received', value=[3, 0, 1, 0, 8])
        assert(p.dtype == 'int')
        p.dtype = DType.boolean
        assert(p.dtype == 'boolean')
        assert(p.value == [True, False, True, False, True])

        q = Property(name='sent',
                     value=['False', True, 'TRUE', '0', 't', 'F', 'Ft'])
        assert(q.dtype == 'string')
        q.dtype = DType.boolean
        assert(q.dtype == 'boolean')
        assert(q.value == [False, True, True, False, True, False, True])
Esempio n. 6
0
    def test_str_to_int_convert(self):
        # Success Test
        p = Property(name='cats_onboard', value=['3', '0', '1', '0', '8'])
        assert(p.dtype == 'string')
        p.dtype = DType.int
        assert(p.dtype == 'int')
        assert(p.values == [3, 0, 1, 0, 8])

        # Failure Test
        p = Property(name='dogs_onboard', value=['7', '20', '1 Dog', 'Seven'])
        assert(p.dtype == 'string')

        with self.assertRaises(ValueError):
            p.dtype = DType.int

        assert(p.dtype == 'string')
        assert(p.values == ['7', '20', '1 Dog', 'Seven'])
Esempio n. 7
0
    def test_name(self):
        # Test id is used when name is not provided
        p = Property()
        self.assertIsNotNone(p.name)
        self.assertEqual(p.name, p.id)

        # Test name is properly set on init
        name = "rumpelstilzchen"
        p = Property(name)
        self.assertEqual(p.name, name)

        # Test name can be properly set on single and connected Properties
        prop = Property()
        self.assertNotEqual(prop.name, "prop")
        prop.name = "prop"
        self.assertEqual(prop.name, "prop")

        sec = Section()
        prop_a = Property(parent=sec)
        self.assertNotEqual(prop_a.name, "prop_a")
        prop_a.name = "prop_a"
        self.assertEqual(prop_a.name, "prop_a")

        # Test property name can be changed with siblings
        prop_b = Property(name="prop_b", parent=sec)
        self.assertEqual(prop_b.name, "prop_b")
        prop_b.name = "prop"
        self.assertEqual(prop_b.name, "prop")

        # Test property name set will fail on existing sibling with same name
        with self.assertRaises(KeyError):
            prop_b.name = "prop_a"
        self.assertEqual(prop_b.name, "prop")
Esempio n. 8
0
    def test_parent(self):
        p = Property("property_section", parent=Section("S"))
        self.assertIsInstance(p.parent, BaseSection)
        self.assertEqual(len(p.parent._props), 1)

        """ Test if child is removed from _props of a parent after assigning
            a new parent to the child """
        prop_parent = p.parent
        p.parent = Section("S1")
        self.assertEqual(len(prop_parent._props), 0)
        self.assertIsInstance(p.parent, BaseSection)
        self.assertIsInstance(p.parent._props[0], BaseProperty)

        prop_parent = p.parent
        p.parent = None
        self.assertIsNone(p.parent)
        self.assertEqual(len(prop_parent._props), 0)

        with self.assertRaises(ValueError):
            Property("property_prop", parent=Property("P"))
        with self.assertRaises(ValueError):
            Property("property_doc", parent=Document())
Esempio n. 9
0
    def test_comparison(self):
        p_name = "propertyName"
        p_origin = "from over there"
        p_unit = "pears"
        p_uncertainty = "+-12"
        p_ref = "4 8 15 16 23"
        p_def = "an odml test property"
        p_dep = "yes"
        p_dep_val = "42"
        p_val = ["a", "b"]

        prop_a = Property(name=p_name, value_origin=p_origin, unit=p_unit,
                        uncertainty=p_uncertainty, reference=p_ref, definition=p_def,
                        dependency=p_dep, dependency_value=p_dep_val, value=p_val)

        prop_b = Property(name=p_name, value_origin=p_origin, unit=p_unit,
                        uncertainty=p_uncertainty, reference=p_ref, definition=p_def,
                        dependency=p_dep, dependency_value=p_dep_val, value=p_val)

        self.assertEqual(prop_a, prop_b)

        prop_b.name = 'newPropertyName'
        self.assertNotEqual(prop_a, prop_b)
Esempio n. 10
0
    def test_new_id(self):
        prop = Property(name="prop")
        old_id = prop.id

        # Test assign new generated id.
        prop.new_id()
        self.assertNotEqual(old_id, prop.id)

        # Test assign new custom id.
        old_id = prop.id
        prop.new_id("79b613eb-a256-46bf-84f6-207df465b8f7")
        self.assertNotEqual(old_id, prop.id)
        self.assertEqual("79b613eb-a256-46bf-84f6-207df465b8f7", prop.id)

        # Test invalid custom id exception.
        with self.assertRaises(ValueError):
            prop.new_id("crash and burn")
Esempio n. 11
0
    def test_clone(self):
        sec = Section(name="parent")

        # Check different id.
        prop = Property(name="original")
        clone_prop = prop.clone()
        self.assertNotEqual(prop.id, clone_prop.id)

        # Check parent removal in clone.
        prop.parent = sec
        clone_prop = prop.clone()
        self.assertIsNotNone(prop.parent)
        self.assertIsNone(clone_prop.parent)

        # Check keep_id
        prop = Property(name="keepid")
        clone_prop = prop.clone(True)
        self.assertEqual(prop.id, clone_prop.id)
Esempio n. 12
0
    def test_name(self):
        # Test id is used when name is not provided
        prop = Property()
        self.assertIsNotNone(prop.name)
        self.assertEqual(prop.name, prop.id)

        # Test name is properly set on init
        name = "rumpelstilzchen"
        prop = Property(name)
        self.assertEqual(prop.name, name)

        # Test name can be properly set on single and connected Properties
        prop = Property()
        self.assertNotEqual(prop.name, "prop")
        prop.name = "prop"
        self.assertEqual(prop.name, "prop")

        sec = Section()
        prop_a = Property(parent=sec)
        self.assertNotEqual(prop_a.name, "prop_a")
        prop_a.name = "prop_a"
        self.assertEqual(prop_a.name, "prop_a")

        # Test property name can be changed with siblings
        prop_b = Property(name="prop_b", parent=sec)
        self.assertEqual(prop_b.name, "prop_b")
        prop_b.name = "prop"
        self.assertEqual(prop_b.name, "prop")

        # Test property name set will fail on existing sibling with same name
        with self.assertRaises(KeyError):
            prop_b.name = "prop_a"
        self.assertEqual(prop_b.name, "prop")
Esempio n. 13
0
    def test_bool_conversion(self):
        # Success tests
        prop = Property(name='received', value=[1, 0, 1, 0, 1])
        self.assertEqual(prop.dtype, 'int')
        prop.dtype = DType.boolean
        self.assertEqual(prop.dtype, 'boolean')
        self.assertEqual(prop.values, [True, False, True, False, True])

        prop = Property(name='sent', value=['False', True, 'TRUE', '0', 't', 'F', '1'])
        self.assertEqual(prop.dtype, 'string')
        prop.dtype = DType.boolean
        self.assertEqual(prop.dtype, 'boolean')
        self.assertEqual(prop.values, [False, True, True, False, True, False, True])

        # Failure tests
        curr_val = [3, 0, 1, 0, 8]
        curr_type = 'int'
        prop = Property(name='received', value=curr_val)
        self.assertEqual(prop.dtype, curr_type)
        with self.assertRaises(ValueError):
            prop.dtype = DType.boolean
        self.assertEqual(prop.dtype, curr_type)
        self.assertEqual(prop.values, curr_val)

        curr_type = 'string'
        prop = Property(name='sent', value=['False', True, 'TRUE', '0', 't', '12', 'Ft'])
        self.assertEqual(prop.dtype, curr_type)
        with self.assertRaises(ValueError):
            prop.dtype = DType.boolean
        self.assertEqual(prop.dtype, curr_type)
Esempio n. 14
0
    def test_insert(self):
        prop1 = Property(name="prop1", dtype="int", values=[0,2])
        prop1.insert(1, 1)
        self.assertEqual(prop1.values, [0, 1, 2])
        prop1.insert(4, 3)
        self.assertEqual(prop1.values, [0, 1, 2, 3])

        with self.assertRaises(ValueError):
            prop1.append([4, 5])
        self.assertEqual(prop1.values, [0, 1, 2, 3])

        with self.assertRaises(ValueError):
            prop1.insert(1, 3.14)
        with self.assertRaises(ValueError):
            prop1.insert(1, True)
        with self.assertRaises(ValueError):
            prop1.insert(1, "5.927")
        self.assertEqual(prop1.values, [0, 1, 2, 3])

        prop2 = Property(name="prop2", dtype="int", values=[1, 2])
        prop2.insert(1, 3.14, strict=False)
        self.assertEqual(prop2.values, [1, 3, 2])
        prop2.insert(1, True, strict=False)
        self.assertEqual(prop2.values, [1, 1, 3, 2])
        prop2.insert(1, "5.927", strict=False)
        self.assertEqual(prop2.values, [1, 5, 1, 3, 2])
    
        prop3 = Property(name="prop3", dtype="string", values=["a", "c"])
        prop3.insert(1, "b")
        self.assertEqual(prop3.values, ["a", "b", "c"])
        prop3.insert(1, 1, strict=False)
        self.assertEqual(prop3.values, ["a", "1", "b", "c"])
        with self.assertRaises(ValueError):
            prop3.insert(1, 2, strict=True)
        self.assertEqual(prop3.values, ["a", "1", "b", "c"])

        prop4 = Property(name="prop4", dtype="float", values=[1.1, 1.3])
        prop4.insert(1, 1.2)
        self.assertEqual(prop4.values, [1.1, 1.2, 1.3])
        prop4.insert(1, 2, strict=False)
        self.assertEqual(prop4.values, [1.1, 2.0, 1.2, 1.3])
        with self.assertRaises(ValueError):
            prop4.insert(1, 2, strict=True)
        self.assertEqual(prop4.values, [1.1, 2.0, 1.2, 1.3])
    
        prop5 = Property(name="prop5", dtype="2-tuple", values=["(1; 2)", "(5; 6)"])
        prop5.insert(1, "(3; 4)", strict=True)
        self.assertEqual(prop5.values, [['1', '2'], ['3', '4'], ['5', '6']])
        prop5.insert(1, [['4', '5']], strict=True)
        self.assertEqual(prop5.values, [['1', '2'], ['4', '5'], ['3', '4'], ['5', '6']])
        
        prop6 = Property(name="prop6", dtype="boolean", values=[True, True])
        prop6.insert(1, False)
        self.assertEqual(prop6.values, [True, False, True])
        prop6.insert(1, 1, strict=False)
        self.assertEqual(prop6.values, [True, True, False, True])
        with self.assertRaises(ValueError):
            prop6.insert(1, 2, strict=False)
        self.assertEqual(prop6.values, [True, True, False, True])
        with self.assertRaises(ValueError):
            prop6.insert(1, 0, strict=True)
        self.assertEqual(prop6.values, [True, True, False, True])

        prop7 = Property(name="prop7", dtype="date", values=['2011-12-01', '2011-12-04'])
        with self.assertRaises(ValueError):
            prop7.insert(1, '2011-12-03', strict=True)
        self.assertEqual(prop7.values, [datetime.date(2011, 12, 1), datetime.date(2011, 12, 4)])
        prop7.insert(1, '2011-12-03', strict=False)
        self.assertEqual(prop7.values, [datetime.date(2011, 12, 1), datetime.date(2011, 12, 3),
                                        datetime.date(2011, 12, 4)])
        prop7.insert(1, [datetime.date(2011, 12, 2)], strict=True)
        self.assertEqual(prop7.values, [datetime.date(2011, 12, 1), datetime.date(2011, 12, 2),
                                        datetime.date(2011, 12, 3), datetime.date(2011, 12, 4)])


        prop8 = Property(name="prop8", dtype="time", values=['12:00:01', '12:00:04'])
        with self.assertRaises(ValueError):
            prop8.insert(1, '12:00:03', strict=True)
        self.assertEqual(prop8.values, [datetime.time(12, 0, 1), datetime.time(12, 0, 4)])
        prop8.insert(1, '12:00:03', strict=False)
        self.assertEqual(prop8.values, [datetime.time(12, 0, 1), datetime.time(12, 0, 3),
                                        datetime.time(12, 0, 4)])
        prop8.insert(1, [datetime.time(12, 0, 2)], strict=True)
        self.assertEqual(prop8.values, [datetime.time(12, 0, 1), datetime.time(12, 0, 2),
                                        datetime.time(12, 0, 3), datetime.time(12, 0, 4)])

        prop9 = Property(name="prop9", dtype="datetime",
                         values=['2011-12-01 12:00:01', '2011-12-01 12:00:04'])
        with self.assertRaises(ValueError):
            prop9.insert(1, '2011-12-01 12:00:03', strict=True)
        self.assertEqual(prop9.values, [datetime.datetime(2011, 12, 1, 12, 0, 1), 
                                        datetime.datetime(2011, 12, 1, 12, 0, 4)])
        prop9.insert(1, '2011-12-01 12:00:03', strict=False)
        self.assertEqual(prop9.values, [datetime.datetime(2011, 12, 1, 12, 0, 1), 
                                        datetime.datetime(2011, 12, 1, 12, 0, 3),
                                        datetime.datetime(2011, 12, 1, 12, 0, 4)])
        prop9.insert(1, [datetime.datetime(2011, 12, 1, 12, 0, 2)], strict=True)
        self.assertEqual(prop9.values, [datetime.datetime(2011, 12, 1, 12, 0, 1), 
                                        datetime.datetime(2011, 12, 1, 12, 0, 2),
                                        datetime.datetime(2011, 12, 1, 12, 0, 3), 
                                        datetime.datetime(2011, 12, 1, 12, 0, 4)])
        
        prop10 = Property(name="prop", value=["Earth is\n No. 3."], dtype=DType.text)
        prop10.insert(1, "Mars is\n No. 4.", strict=False)
        self.assertEqual(len(prop10), 2)
        self.assertEqual(prop10.values, ["Earth is\n No. 3.", "Mars is\n No. 4."])
        prop10.insert(1, 'A new world emerged?', strict=True)
        self.assertEqual(prop10.values, ["Earth is\n No. 3.",
                                         "A new world emerged?",
                                         "Mars is\n No. 4."])
        prop10.insert(1, 1, strict=False)
        self.assertEqual(prop10.values, ["Earth is\n No. 3.", "1",
                                         "A new world emerged?",
                                         "Mars is\n No. 4."])
        with self.assertRaises(ValueError):
            prop10.insert(1, 1, strict=True)
        self.assertEqual(prop10.values, ["Earth is\n No. 3.", "1",
                                         "A new world emerged?",
                                         "Mars is\n No. 4."])
Esempio n. 15
0
    def test_value_append(self):
        # Test append w/o Property value or dtype
        prop = Property(name="append")
        prop.append(1)
        self.assertEqual(prop.dtype, DType.int)
        self.assertEqual(prop.values, [1])

        # Test append with Property dtype.
        prop = Property(name="append", dtype="int")
        prop.append(3)
        self.assertEqual(prop.values, [3])

        # Test append with Property value
        prop = Property(name="append", value=[1, 2])
        prop.append(3)
        self.assertEqual(prop.values, [1, 2, 3])

        # Test append with Property list value
        prop = Property(name="append", value=[1, 2])
        prop.append([3])
        self.assertEqual(prop.values, [1, 2, 3])

        # Test append of empty values, make sure 0 and False are properly handled
        prop = Property(name="append")
        prop.append(None)
        prop.append("")
        prop.append([])
        prop.append({})
        self.assertEqual(prop.values, [])

        prop.append(0)
        self.assertEqual(prop.values, [0])

        prop.values = None
        prop.dtype = None
        prop.append(False)
        self.assertEqual(prop.values, [False])

        prop = Property(name="append", value=[1, 2])
        prop.append(None)
        prop.append("")
        prop.append([])
        prop.append({})
        self.assertEqual(prop.values, [1, 2])

        prop.append(0)
        self.assertEqual(prop.values, [1, 2, 0])

        # Test fail append with multiple values
        prop = Property(name="append", value=[1, 2, 3])
        with self.assertRaises(ValueError):
            prop.append([4, 5])
        self.assertEqual(prop.values, [1, 2, 3])

        # Test fail append with mismatching dtype
        prop = Property(name="append", value=[1, 2], dtype="int")
        with self.assertRaises(ValueError):
            prop.append([3.14])
        with self.assertRaises(ValueError):
            prop.append([True])
        with self.assertRaises(ValueError):
            prop.append(["5.927"])
        self.assertEqual(prop.values, [1, 2])

        # Test strict flag
        prop.append(3.14, strict=False)
        prop.append(True, strict=False)
        prop.append("5.927", strict=False)
        self.assertEqual(prop.values, [1, 2, 3, 1, 5])

        # Make sure non-convertible values still raise an error
        with self.assertRaises(ValueError):
            prop.append("invalid")
        self.assertEqual(prop.values, [1, 2, 3, 1, 5])

        prop5 = Property("test", value="a string")
        prop5.append("Freude")
        self.assertEqual(len(prop5), 2)
        self.assertRaises(ValueError, prop5.append, "[a, b, c]")

        prop6 = Property(name="prop", value=["A Abraham", "B Barnes", "C Clark"],
                         dtype=DType.person)
        prop6.append("D Dickins")
        self.assertEqual(len(prop6), 4)
        self.assertRaises(ValueError, prop6.append, 1)
        self.assertRaises(ValueError, prop6.append, 1.3)
        self.assertRaises(ValueError, prop6.append, True)

        prop7 = Property(name="prop", value=["https://en.wikipedia.org/wiki/Earth"],
                         dtype=DType.url)
        prop7.append("https://en.wikipedia.org/wiki/Mars")
        self.assertEqual(len(prop7), 2)
        self.assertRaises(ValueError, prop7.append, 1)
        self.assertRaises(ValueError, prop7.append, 1.3)
        self.assertRaises(ValueError, prop7.append, True)

        prop8 = Property(name="prop", value=["Earth is No. 3."], dtype=DType.text)
        prop8.append("Mars is No. 4.")
        self.assertEqual(len(prop8), 2)
        self.assertRaises(ValueError, prop8.append, 1)
        self.assertRaises(ValueError, prop8.append, 1.3)
        self.assertRaises(ValueError, prop8.append, True)

        prop9 = Property(name="tuple-test", dtype="3-tuple", values="(1; 2; 3)")
        prop9.append("(7; 8; 9)")
        self.assertEqual(len(prop9), 2)
        self.assertRaises(ValueError, prop9.append, "(10; 11)")
        prop9.append([[2, 3, 4]])
        self.assertEqual(len(prop9), 3)
        self.assertRaises(ValueError, prop9.append, [[10, 11]])

        prop10 = Property(name="prop10", dtype="date", values=['2011-12-01', '2011-12-02'])
        with self.assertRaises(ValueError):
            prop10.append('2011-12-03', strict=True)
        self.assertEqual(prop10.values, [datetime.date(2011, 12, 1), datetime.date(2011, 12, 2)])
        prop10.append('2011-12-03', strict=False)
        self.assertEqual(prop10.values, [datetime.date(2011, 12, 1), datetime.date(2011, 12, 2),
                                         datetime.date(2011, 12, 3)])
        prop10.append([datetime.date(2011, 12, 4)], strict=True)
        self.assertEqual(prop10.values, [datetime.date(2011, 12, 1), datetime.date(2011, 12, 2),
                                         datetime.date(2011, 12, 3), datetime.date(2011, 12, 4)])


        prop11 = Property(name="prop11", dtype="time", values=['12:00:01', '12:00:02'])
        with self.assertRaises(ValueError):
            prop11.append('12:00:03', strict=True)
        self.assertEqual(prop11.values, [datetime.time(12, 0, 1), datetime.time(12, 0, 2)])
        prop11.append('12:00:03', strict=False)
        self.assertEqual(prop11.values, [datetime.time(12, 0, 1), datetime.time(12, 0, 2),
                                         datetime.time(12, 0, 3)])
        prop11.append([datetime.time(12, 0, 4)], strict=True)
        self.assertEqual(prop11.values, [datetime.time(12, 0, 1), datetime.time(12, 0, 2),
                                         datetime.time(12, 0, 3), datetime.time(12, 0, 4)])

        prop12 = Property(name="prop12", dtype="datetime",
                          values=['2011-12-01 12:00:01', '2011-12-01 12:00:02'])
        with self.assertRaises(ValueError):
            prop12.append('2011-12-01 12:00:03', strict=True)
        self.assertEqual(prop12.values, [datetime.datetime(2011, 12, 1, 12, 0, 1),
                                         datetime.datetime(2011, 12, 1, 12, 0, 2)])
        prop12.append('2011-12-01 12:00:03', strict=False)
        self.assertEqual(prop12.values, [datetime.datetime(2011, 12, 1, 12, 0, 1),
                                         datetime.datetime(2011, 12, 1, 12, 0, 2),
                                         datetime.datetime(2011, 12, 1, 12, 0, 3)])
        prop12.append([datetime.datetime(2011, 12, 1, 12, 0, 4)], strict=True)
        self.assertEqual(prop12.values, [datetime.datetime(2011, 12, 1, 12, 0, 1),
                                         datetime.datetime(2011, 12, 1, 12, 0, 2),
                                         datetime.datetime(2011, 12, 1, 12, 0, 3),
                                         datetime.datetime(2011, 12, 1, 12, 0, 4)])
Esempio n. 16
0
    def test_values_cardinality(self):
        doc = Document()
        sec = Section(name="sec", type="type", parent=doc)

        # -- Test set cardinality on Property init
        # Test empty init
        prop_card_none = Property(name="prop_cardinality_empty", parent=sec)
        self.assertIsNone(prop_card_none.val_cardinality)

        # Test single int max init
        prop_card_max = Property(name="prop_cardinality_max", val_cardinality=10, parent=sec)
        self.assertEqual(prop_card_max.val_cardinality, (None, 10))

        # Test tuple init
        prop_card_min = Property(name="prop_cardinality_min", val_cardinality=(2, None), parent=sec)
        self.assertEqual(prop_card_min.val_cardinality, (2, None))

        # -- Test Property cardinality re-assignment
        prop = Property(name="prop", val_cardinality=(None, 10), parent=sec)
        self.assertEqual(prop.val_cardinality, (None, 10))

        # Test Property cardinality reset
        for non_val in [None, "", [], ()]:
            prop.val_cardinality = non_val
            self.assertIsNone(prop.val_cardinality)
            prop.val_cardinality = 1

        # Test Property cardinality single int max assignment
        prop.val_cardinality = 10
        self.assertEqual(prop.val_cardinality, (None, 10))

        # Test Property cardinality tuple max assignment
        prop.val_cardinality = (None, 5)
        self.assertEqual(prop.val_cardinality, (None, 5))

        # Test Property cardinality tuple min assignment
        prop.val_cardinality = (5, None)
        self.assertEqual(prop.val_cardinality, (5, None))

        # Test Property cardinality min/max assignment
        prop.val_cardinality = (1, 5)
        self.assertEqual(prop.val_cardinality, (1, 5))

        # -- Test Property cardinality assignment failures
        with self.assertRaises(ValueError):
            prop.val_cardinality = "a"

        with self.assertRaises(ValueError):
            prop.val_cardinality = -1

        with self.assertRaises(ValueError):
            prop.val_cardinality = (1, "b")

        with self.assertRaises(ValueError):
            prop.val_cardinality = (1, 2, 3)

        with self.assertRaises(ValueError):
            prop.val_cardinality = (-1, 1)

        with self.assertRaises(ValueError):
            prop.val_cardinality = (1, -5)

        with self.assertRaises(ValueError):
            prop.val_cardinality = (5, 1)
Esempio n. 17
0
 def test_time(self):
     p = Property("test", value=dt.now().time())
     assert(p.dtype == "time")
     assert(type(p.value[0]) == time)
    def test_value_extend(self):
        prop = Property(name="extend")

        # Test extend w/o Property value or dtype.
        val = [1, 2, 3]
        prop.extend(val)
        self.assertEqual(prop.dtype, DType.int)
        self.assertEqual(prop.values, val)

        # Extend with single value.
        prop.extend(4)
        self.assertEqual(prop.values, [1, 2, 3, 4])

        # Extend with list value.
        prop.extend([5, 6])
        self.assertEqual(prop.values, [1, 2, 3, 4, 5, 6])

        # Test extend w/o Property value
        prop = Property(name="extend", dtype="float")
        prop.extend([1.0, 2.0, 3.0])
        self.assertEqual(prop.values, [1.0, 2.0, 3.0])

        # Test extend with Property value
        prop = Property(name="extend", value=10)
        prop.extend([20, 30, '40'])
        self.assertEqual(prop.values, [10, 20, 30, 40])

        # Test extend fail with mismatching dtype
        with self.assertRaises(ValueError):
            prop.extend(['5', 6, 7])
        with self.assertRaises(ValueError):
            prop.extend([5, 6, 'a'])

        # Test extend via Property
        prop = Property(name="extend", value=["a", "b"])
        ext_prop = Property(name="value extend", value="c")
        prop.extend(ext_prop)
        self.assertEqual(prop.values, ["a", "b", "c"])

        ext_prop.values = ["d", "e"]
        prop.extend(ext_prop)
        self.assertEqual(prop.values, ["a", "b", "c", "d", "e"])

        ext_prop = Property(name="value extend", value=[1, 2 ,3])
        with self.assertRaises(ValueError):
            prop.extend(ext_prop)
        self.assertEqual(prop.values, ["a", "b", "c", "d", "e"])

        # Test extend via Property unit check
        prop = Property(name="extend", value=[1, 2], unit="mV")
        ext_prop = Property(name="extend", value=[3, 4], unit="mV")
        prop.extend(ext_prop)
        self.assertEqual(prop.values, [1, 2, 3, 4])

        ext_prop.unit = "kV"
        with self.assertRaises(ValueError):
            prop.extend(ext_prop)
        self.assertEqual(prop.values, [1, 2, 3, 4])

        ext_prop.unit = ""
        with self.assertRaises(ValueError):
            prop.extend(ext_prop)
        self.assertEqual(prop.values, [1, 2, 3, 4])

        # Test strict flag
        prop = Property(name="extend", value=[1, 2], dtype="int")
        with self.assertRaises(ValueError):
            prop.extend([3.14, True, "5.927"])
        self.assertEqual(prop.values, [1, 2])

        prop.extend([3.14, True, "5.927"], strict=False)
        self.assertEqual(prop.values, [1, 2, 3, 1, 5])

        # Make sure non-convertible values still raise an error
        with self.assertRaises(ValueError):
            prop.extend([6, "some text"])
Esempio n. 19
0
 def test_datetime(self):
     p = Property("test", value=dt.now())
     assert (p.dtype == "datetime")
     assert isinstance(p.values[0], dt)
Esempio n. 20
0
 def test_date(self):
     p = Property("test", dt.now().date())
     assert (p.dtype == "date")
     assert isinstance(p.values[0], date)
Esempio n. 21
0
    def test_dtype(self):
        prop = Property(name="prop")

        # Test assignment of all supported dtypes.
        for curr_type in DType:
            prop.dtype = curr_type
            self.assertEqual(prop.dtype, curr_type)

        # Test assignment of dtype alias.
        prop.dtype = "bool"
        self.assertEqual(prop.dtype, "bool")
        prop.dtype = "str"
        self.assertEqual(prop.dtype, "str")

        # Test assignment of tuple.
        prop.dtype = "2-tuple"
        self.assertEqual(prop.dtype, "2-tuple")

        # Test set None
        prop.dtype = None
        self.assertIsNone(prop.dtype)

        # Test assignment fails.
        with self.assertRaises(AttributeError):
            prop.dtype = 1
        with self.assertRaises(AttributeError):
            prop.dtype = "crash and burn"
        with self.assertRaises(AttributeError):
            prop.dtype = "x-tuple"

        # Test not setting None when a property contains values.
        prop.values = [1, 2, 3]
        self.assertIsNotNone(prop.dtype)
        prop.dtype = None
        self.assertIsNotNone(prop.dtype)
Esempio n. 22
0
 def test_time(self):
     p = Property("test", value=dt.now().time())
     assert (p.dtype == "time")
     assert isinstance(p.values[0], time)
    def test_value_append(self):
        # Test append w/o Property value or dtype
        prop = Property(name="append")
        prop.append(1)
        self.assertEqual(prop.dtype, DType.int)
        self.assertEqual(prop.values, [1])

        # Test append with Property dtype.
        prop = Property(name="append", dtype="int")
        prop.append(3)
        self.assertEqual(prop.values, [3])

        # Test append with Property value
        prop = Property(name="append", value=[1, 2])
        prop.append(3)
        self.assertEqual(prop.values, [1, 2, 3])

        # Test append with Property list value
        prop = Property(name="append", value=[1, 2])
        prop.append([3])
        self.assertEqual(prop.values, [1, 2, 3])

        # Test append of empty values, make sure 0 and False are properly handled
        prop = Property(name="append")
        prop.append(None)
        prop.append("")
        prop.append([])
        prop.append({})
        self.assertEqual(prop.values, [])

        prop.append(0)
        self.assertEqual(prop.values, [0])

        prop.values = None
        prop.dtype = None
        prop.append(False)
        self.assertEqual(prop.values, [False])

        prop = Property(name="append", value=[1, 2])
        prop.append(None)
        prop.append("")
        prop.append([])
        prop.append({})
        self.assertEqual(prop.values, [1, 2])

        prop.append(0)
        self.assertEqual(prop.values, [1, 2, 0])

        # Test fail append with multiple values
        prop = Property(name="append", value=[1, 2, 3])
        with self.assertRaises(ValueError):
            prop.append([4, 5])
        self.assertEqual(prop.values, [1, 2, 3])

        # Test fail append with mismatching dtype
        prop = Property(name="append", value=[1, 2], dtype="int")
        with self.assertRaises(ValueError):
            prop.append([3.14])
        with self.assertRaises(ValueError):
            prop.append([True])
        with self.assertRaises(ValueError):
            prop.append(["5.927"])
        self.assertEqual(prop.values, [1, 2])

        # Test strict flag
        prop.append(3.14, strict=False)
        prop.append(True, strict=False)
        prop.append("5.927", strict=False)
        self.assertEqual(prop.values, [1, 2, 3, 1, 5])

        # Make sure non-convertible values still raise an error
        with self.assertRaises(ValueError):
            prop.append("invalid")
        self.assertEqual(prop.values, [1, 2, 3, 1, 5])

        p5 = Property("test", value="a string")
        p5.append("Freude")
        self.assertEqual(len(p5), 2)
        self.assertRaises(ValueError, p5.append, "[a, b, c]")
    def test_bool_conversion(self):
        # Success tests
        p = Property(name='received', value=[1, 0, 1, 0, 1])
        assert(p.dtype == 'int')
        p.dtype = DType.boolean
        assert(p.dtype == 'boolean')
        assert(p.values == [True, False, True, False, True])

        q = Property(name='sent', value=['False', True, 'TRUE', '0', 't', 'F', '1'])
        assert(q.dtype == 'string')
        q.dtype = DType.boolean
        assert(q.dtype == 'boolean')
        assert(q.values == [False, True, True, False, True, False, True])

        # Failure tests
        curr_val = [3, 0, 1, 0, 8]
        curr_type = 'int'
        p = Property(name='received', value=curr_val)
        assert(p.dtype == curr_type)
        with self.assertRaises(ValueError):
            p.dtype = DType.boolean
        assert(p.dtype == curr_type)
        assert(p.values == curr_val)

        curr_type = 'string'
        q = Property(name='sent', value=['False', True, 'TRUE', '0', 't', '12', 'Ft'])
        assert(q.dtype == curr_type)
        with self.assertRaises(ValueError):
            q.dtype = DType.boolean
        assert(q.dtype == curr_type)
Esempio n. 25
0
    def test_merge_check(self):
        # Test dtype check
        source = Property(name="source", dtype="string")
        destination = Property(name="destination", dtype="string")

        destination.merge_check(source)
        source.dtype = "int"
        with self.assertRaises(ValueError):
            destination.merge_check(source)

        destination.merge_check(source, False)

        # Test value check
        source = Property(name="source", value=[1, 2, 3])
        destination = Property(name="destination", value=[4, 5, 6])
        destination.merge_check(source)

        # Test value convertable
        source = Property(name="source", value=["7", "8"])
        with self.assertRaises(ValueError):
            destination.merge_check(source)

        destination.merge_check(source, False)

        # Test value not convertable
        source = Property(name="source", value=["nine", "ten"])
        with self.assertRaises(ValueError):
            destination.merge_check(source)
        with self.assertRaises(ValueError):
            destination.merge_check(source, False)

        # Test unit check
        source = Property(name="source", unit="Hz")
        destination = Property(name="destination", unit="Hz")

        destination.merge_check(source)
        source.unit = "s"
        with self.assertRaises(ValueError):
            destination.merge_check(source)

        destination.merge_check(source, False)

        # Test uncertainty check
        source = Property(name="source", uncertainty=0.0)
        destination = Property(name="destination", uncertainty=0.0)

        destination.merge_check(source)
        source.uncertainty = 10.0
        with self.assertRaises(ValueError):
            destination.merge_check(source)

        destination.merge_check(source, False)

        # Test definition check
        source = Property(name="source", definition="Freude\t schoener\nGoetterfunken\n")
        destination = Property(name="destination",
                               definition="FREUDE schoener GOETTERfunken")

        destination.merge_check(source)
        source.definition = "Freunde schoender Goetterfunken"
        with self.assertRaises(ValueError):
            destination.merge_check(source)

        destination.merge_check(source, False)

        # Test reference check
        source = Property(name="source", reference="portal.g-node.org")
        destination = Property(name="destination", reference="portal.g-node.org")

        destination.merge_check(source)
        source.reference = "portal.g-node.org/odml/terminologies/v1.1"
        with self.assertRaises(ValueError):
            destination.merge_check(source)

        destination.merge_check(source, False)

        # Test value origin check
        source = Property(name="source", value_origin="file")
        destination = Property(name="destination", value_origin="file")

        destination.merge_check(source)
        source.value_origin = "other file"
        with self.assertRaises(ValueError):
            destination.merge_check(source)

        destination.merge_check(source, False)
Esempio n. 26
0
    def test_get_merged_equivalent(self):
        sec = Section(name="parent")
        mersec = Section(name="merged_section")
        merprop_other = Property(name="other_prop", value="other")
        merprop = Property(name="prop", value=[1, 2, 3])

        # Check None on unset parent.
        prop = Property(name="prop")
        self.assertIsNone(prop.get_merged_equivalent())

        # Check None on parent without merged Section.
        prop.parent = sec
        self.assertIsNone(prop.get_merged_equivalent())

        # Check None on parent with merged Section but no attached Property.
        sec.merge(mersec)
        self.assertIsNone(prop.get_merged_equivalent())

        # Check None on parent with merged Section and unequal Property.
        merprop_other.parent = mersec
        self.assertIsNone(prop.get_merged_equivalent())

        # Check receiving merged equivalent Property.
        merprop.parent = mersec
        self.assertIsNotNone(prop.get_merged_equivalent())
        self.assertEqual(prop.get_merged_equivalent(), merprop)
Esempio n. 27
0
    def test_merge_check(self):
        # Test dtype check
        source = Property(name="source", dtype="string")
        destination = Property(name="destination", dtype="string")

        destination.merge_check(source)
        source.dtype = "int"
        with self.assertRaises(ValueError):
            destination.merge_check(source)

        destination.merge_check(source, False)

        # Test value check
        source = Property(name="source", value=[1, 2, 3])
        destination = Property(name="destination", value=[4, 5, 6])
        destination.merge_check(source)

        # Test value convertable
        source = Property(name="source", value=["7", "8"])
        with self.assertRaises(ValueError):
            destination.merge_check(source)

        destination.merge_check(source, False)

        # Test value not convertable
        source = Property(name="source", value=["nine", "ten"])
        with self.assertRaises(ValueError):
            destination.merge_check(source)
        with self.assertRaises(ValueError):
            destination.merge_check(source, False)

        # Test unit check
        source = Property(name="source", unit="Hz")
        destination = Property(name="destination", unit="Hz")

        destination.merge_check(source)
        source.unit = "s"
        with self.assertRaises(ValueError):
            destination.merge_check(source)

        destination.merge_check(source, False)

        # Test uncertainty check
        source = Property(name="source", uncertainty=0.0)
        destination = Property(name="destination", uncertainty=0.0)

        destination.merge_check(source)
        source.uncertainty = 10.0
        with self.assertRaises(ValueError):
            destination.merge_check(source)

        destination.merge_check(source, False)

        # Test definition check
        source = Property(name="source", definition="Freude\t schoener\nGoetterfunken\n")
        destination = Property(name="destination",
                               definition="FREUDE schoener GOETTERfunken")

        destination.merge_check(source)
        source.definition = "Freunde schoender Goetterfunken"
        with self.assertRaises(ValueError):
            destination.merge_check(source)

        destination.merge_check(source, False)

        # Test reference check
        source = Property(name="source", reference="portal.g-node.org")
        destination = Property(name="destination", reference="portal.g-node.org")

        destination.merge_check(source)
        source.reference = "portal.g-node.org/odml/terminologies/v1.1"
        with self.assertRaises(ValueError):
            destination.merge_check(source)

        destination.merge_check(source, False)

        # Test value origin check
        source = Property(name="source", value_origin="file")
        destination = Property(name="destination", value_origin="file")

        destination.merge_check(source)
        source.value_origin = "other file"
        with self.assertRaises(ValueError):
            destination.merge_check(source)

        destination.merge_check(source, False)
Esempio n. 28
0
 def test_date(self):
     p = Property("test", dt.now().date())
     assert(p.dtype == "date")
     assert(type(p.value[0]) == date)
Esempio n. 29
0
    def test_merge(self):
        p_dst = Property("p1", value=[1, 2, 3], unit="Hz", definition="Freude\t schoener\nGoetterfunken\n",
                         reference="portal.g-node.org", uncertainty=0.0, value_origin="file")
        p_src = Property("p2", value=[2, 4, 6], unit="Hz", definition="FREUDE schoener GOETTERfunken")

        test_p = p_dst.clone()
        test_p.merge(p_src)
        self.assertEqual(len(test_p.values), 5)

        p_inv_unit = p_src.clone()
        p_inv_unit.unit = 's'

        p_inv_def = p_src.clone()
        p_inv_def.definition = "Freunde schoender Goetterfunken"

        p_inv_uncert = p_src.clone()
        p_inv_uncert.uncertainty = 10.0

        p_inv_ref = p_src.clone()
        p_inv_ref.reference = "test"

        p_inv_origin = p_src.clone()
        p_inv_origin.value_origin = "other file"

        test_p = p_dst.clone()
        self.assertRaises(ValueError, test_p.merge, p_inv_unit)
        self.assertRaises(ValueError, test_p.merge, p_inv_def)
        self.assertRaises(ValueError, test_p.merge, p_inv_uncert)
        self.assertRaises(ValueError, test_p.merge, p_inv_ref)
        self.assertRaises(ValueError, test_p.merge, p_inv_origin)

        test_p.reference = None
        test_p.merge(p_src)
        self.assertEqual(test_p.reference, p_src.reference)

        test_p.unit = ""
        test_p.merge(p_src)
        self.assertEqual(test_p.unit, p_src.unit)

        test_p.uncertainty = None
        test_p.merge(p_src)
        self.assertEqual(test_p.uncertainty, p_src.uncertainty)

        test_p.definition = ""
        test_p.merge(p_src)
        self.assertEqual(test_p.definition, p_src.definition)

        test_p.value_origin = ""
        test_p.merge(p_src)
        self.assertEqual(test_p.value_origin, p_src.value_origin)

        double_p = Property("adouble", value=3.14)
        int_p = Property("aint", value=3)
        self.assertRaises(ValueError, double_p.merge, int_p)

        int_p.merge(double_p, strict=False)
        self.assertEqual(len(int_p), 2)
Esempio n. 30
0
    def test_simple_attributes(self):
        p_name = "propertyName"
        p_origin = "from over there"
        p_unit = "pears"
        p_uncertainty = "12"
        p_ref = "4 8 15 16 23"
        p_def = "an odml test property"
        p_dep = "yes"
        p_dep_val = "42"

        prop = Property(name=p_name, value_origin=p_origin, unit=p_unit,
                        uncertainty=p_uncertainty, reference=p_ref, definition=p_def,
                        dependency=p_dep, dependency_value=p_dep_val)

        self.assertEqual(prop.name, p_name)
        self.assertEqual(prop.value_origin, p_origin)
        self.assertEqual(prop.unit, p_unit)
        self.assertEqual(prop.uncertainty, p_uncertainty)
        self.assertEqual(prop.reference, p_ref)
        self.assertEqual(prop.definition, p_def)
        self.assertEqual(prop.dependency, p_dep)
        self.assertEqual(prop.dependency_value, p_dep_val)

        # Test setting attributes
        prop.name = "%s_edit" % p_name
        self.assertEqual(prop.name, "%s_edit" % p_name)
        prop.value_origin = "%s_edit" % p_origin
        self.assertEqual(prop.value_origin, "%s_edit" % p_origin)
        prop.unit = "%s_edit" % p_unit
        self.assertEqual(prop.unit, "%s_edit" % p_unit)
        prop.uncertainty = 13
        self.assertEqual(prop.uncertainty, 13.0)
        prop.reference = "%s_edit" % p_ref
        self.assertEqual(prop.reference, "%s_edit" % p_ref)
        prop.definition = "%s_edit" % p_def
        self.assertEqual(prop.definition, "%s_edit" % p_def)
        prop.dependency = "%s_edit" % p_dep
        self.assertEqual(prop.dependency, "%s_edit" % p_dep)
        prop.dependency_value = "%s_edit" % p_dep_val
        self.assertEqual(prop.dependency_value, "%s_edit" % p_dep_val)

        # Test setting attributes to None when '' is passed.
        prop.value_origin = ""
        self.assertIsNone(prop.value_origin)
        prop.unit = ""
        self.assertIsNone(prop.unit)
        prop.uncertainty = ""
        self.assertIsNone(prop.uncertainty)
        prop.reference = ""
        self.assertIsNone(prop.reference)
        prop.definition = ""
        self.assertIsNone(prop.definition)
        prop.dependency = ""
        self.assertIsNone(prop.dependency)
        prop.dependency_value = ""
        self.assertIsNone(prop.dependency_value)
Esempio n. 31
0
    def test_get_merged_equivalent(self):
        sec = Section(name="parent")
        mersec = Section(name="merged_section")
        merprop_other = Property(name="other_prop", value="other")
        merprop = Property(name="prop", value=[1, 2, 3])

        # Check None on unset parent.
        prop = Property(name="prop")
        self.assertIsNone(prop.get_merged_equivalent())

        # Check None on parent without merged Section.
        prop.parent = sec
        self.assertIsNone(prop.get_merged_equivalent())

        # Check None on parent with merged Section but no attached Property.
        sec.merge(mersec)
        self.assertIsNone(prop.get_merged_equivalent())

        # Check None on parent with merged Section and unequal Property.
        merprop_other.parent = mersec
        self.assertIsNone(prop.get_merged_equivalent())

        # Check receiving merged equivalent Property.
        merprop.parent = mersec
        self.assertIsNotNone(prop.get_merged_equivalent())
        self.assertEqual(prop.get_merged_equivalent(), merprop)
Esempio n. 32
0
    def test_set_values_cardinality(self):
        doc = Document()
        sec = Section(name="sec", type="sec_type", parent=doc)

        prop = Property(name="prop", val_cardinality=1, parent=sec)

        # Test Property values cardinality min assignment
        prop.set_values_cardinality(1)
        self.assertEqual(prop.val_cardinality, (1, None))

        # Test Property values cardinality keyword min assignment
        prop.set_values_cardinality(min_val=2)
        self.assertEqual(prop.val_cardinality, (2, None))

        # Test Property values cardinality max assignment
        prop.set_values_cardinality(None, 1)
        self.assertEqual(prop.val_cardinality, (None, 1))

        # Test Property values cardinality keyword max assignment
        prop.set_values_cardinality(max_val=2)
        self.assertEqual(prop.val_cardinality, (None, 2))

        # Test Property values cardinality min max assignment
        prop.set_values_cardinality(1, 2)
        self.assertEqual(prop.val_cardinality, (1, 2))

        # Test Property values cardinality keyword min max assignment
        prop.set_values_cardinality(min_val=2, max_val=5)
        self.assertEqual(prop.val_cardinality, (2, 5))

        # Test Property values cardinality empty reset
        prop.set_values_cardinality()
        self.assertIsNone(prop.val_cardinality)

        # Test Property values cardinality keyword empty reset
        prop.set_values_cardinality(1)
        self.assertIsNotNone(prop.val_cardinality)
        prop.set_values_cardinality(min_val=None, max_val=None)
        self.assertIsNone(prop.val_cardinality)
Esempio n. 33
0
 def test_float(self):
     p = Property("test", value=3.14)
     assert (p.dtype == "float")
     assert isinstance(p.values[0], float)
Esempio n. 34
0
    def test_value_extend(self):
        prop = Property(name="extend")

        # Test extend w/o Property value or dtype.
        val = [1, 2, 3]
        prop.extend(val)
        self.assertEqual(prop.dtype, DType.int)
        self.assertEqual(prop.values, val)

        # Extend with single value.
        prop.extend(4)
        self.assertEqual(prop.values, [1, 2, 3, 4])

        # Extend with list value.
        prop.extend([5, 6])
        self.assertEqual(prop.values, [1, 2, 3, 4, 5, 6])

        # Test extend w/o Property value
        prop = Property(name="extend", dtype="float")
        prop.extend([1.0, 2.0, 3.0])
        self.assertEqual(prop.values, [1.0, 2.0, 3.0])

        # Test extend with Property value
        prop = Property(name="extend", value=10)
        prop.extend([20, 30, '40'])
        self.assertEqual(prop.values, [10, 20, 30, 40])

        # Test extend fail with mismatching dtype
        with self.assertRaises(ValueError):
            prop.extend(['5', 6, 7])
        with self.assertRaises(ValueError):
            prop.extend([5, 6, 'a'])

        # Test extend via Property
        prop = Property(name="extend", value=["a", "b"])
        ext_prop = Property(name="value extend", value="c")
        prop.extend(ext_prop)
        self.assertEqual(prop.values, ["a", "b", "c"])

        ext_prop.values = ["d", "e"]
        prop.extend(ext_prop)
        self.assertEqual(prop.values, ["a", "b", "c", "d", "e"])

        ext_prop = Property(name="value extend", value=[1, 2, 3])
        with self.assertRaises(ValueError):
            prop.extend(ext_prop)
        self.assertEqual(prop.values, ["a", "b", "c", "d", "e"])

        # Test extend via Property unit check
        prop = Property(name="extend", value=[1, 2], unit="mV")
        ext_prop = Property(name="extend", value=[3, 4], unit="mV")
        prop.extend(ext_prop)
        self.assertEqual(prop.values, [1, 2, 3, 4])

        ext_prop.unit = "kV"
        with self.assertRaises(ValueError):
            prop.extend(ext_prop)
        self.assertEqual(prop.values, [1, 2, 3, 4])

        ext_prop.unit = ""
        with self.assertRaises(ValueError):
            prop.extend(ext_prop)
        self.assertEqual(prop.values, [1, 2, 3, 4])

        # Test strict flag
        prop = Property(name="extend", value=[1, 2], dtype="int")
        with self.assertRaises(ValueError):
            prop.extend([3.14, True, "5.927"])
        self.assertEqual(prop.values, [1, 2])

        prop.extend([3.14, True, "5.927"], strict=False)
        self.assertEqual(prop.values, [1, 2, 3, 1, 5])

        # Make sure non-convertible values still raise an error
        with self.assertRaises(ValueError):
            prop.extend([6, "some text"])

        prop1 = Property(name="prop", value=["A Abraham", "B Barnes", "C Clark"],
                         dtype=DType.person)
        prop1.extend("D Dickins")
        self.assertEqual(len(prop1), 4)
        self.assertRaises(ValueError, prop1.extend, 1)
        self.assertRaises(ValueError, prop1.extend, 1.3)
        self.assertRaises(ValueError, prop1.extend, True)

        prop2 = Property(name="prop", value=["https://en.wikipedia.org/wiki/Earth"],
                         dtype=DType.url)
        prop2.extend("https://en.wikipedia.org/wiki/Mars")
        self.assertEqual(len(prop2), 2)
        self.assertRaises(ValueError, prop2.extend, 1)
        self.assertRaises(ValueError, prop2.extend, 1.3)
        self.assertRaises(ValueError, prop2.extend, True)

        prop3 = Property(name="prop", value=["Earth is No. 3."], dtype=DType.text)
        prop3.extend("Mars is No. 4.")
        self.assertEqual(len(prop3), 2)
        self.assertRaises(ValueError, prop3.extend, 1)
        self.assertRaises(ValueError, prop3.extend, 1.3)
        self.assertRaises(ValueError, prop3.extend, True)

        prop4 = Property(name="tuple-test", dtype="3-tuple", values="(1; 2; 3)")
        prop4.extend(["(7; 8; 9)", "(10; 11; 12)"])
        self.assertEqual(len(prop4), 3)
        self.assertRaises(ValueError, prop4.extend, "(10; 11)")
        prop4.extend([[2, 3, 4], [5, 6, 7]])
        self.assertEqual(len(prop4), 5)
        self.assertRaises(ValueError, prop4.extend, [[10, 11]])

        prop4 = Property(name="prop4", dtype="date", values=['2011-12-01', '2011-12-02'])
        with self.assertRaises(ValueError):
            prop4.extend('2011-12-03', strict=True)
        self.assertEqual(prop4.values, [datetime.date(2011, 12, 1), datetime.date(2011, 12, 2)])
        prop4.extend('2011-12-03', strict=False)
        self.assertEqual(prop4.values, [datetime.date(2011, 12, 1), datetime.date(2011, 12, 2),
                                        datetime.date(2011, 12, 3)])
        prop4.extend([datetime.date(2011, 12, 4)], strict=True)
        self.assertEqual(prop4.values, [datetime.date(2011, 12, 1), datetime.date(2011, 12, 2),
                                        datetime.date(2011, 12, 3), datetime.date(2011, 12, 4)])
        prop4.extend([datetime.date(2011, 12, 5), datetime.date(2011, 12, 6)], strict=True)
        self.assertEqual(prop4.values, [datetime.date(2011, 12, 1), datetime.date(2011, 12, 2),
                                        datetime.date(2011, 12, 3), datetime.date(2011, 12, 4),
                                        datetime.date(2011, 12, 5), datetime.date(2011, 12, 6)])
        with self.assertRaises(ValueError):
            prop4.extend(['2011-12-03', 'abc'], strict=False)


        prop5 = Property(name="prop5", dtype="time", values=['12:00:01', '12:00:02'])
        with self.assertRaises(ValueError):
            prop5.extend('12:00:03', strict=True)
        self.assertEqual(prop5.values, [datetime.time(12, 0, 1), datetime.time(12, 0, 2)])
        prop5.extend('12:00:03', strict=False)
        self.assertEqual(prop5.values, [datetime.time(12, 0, 1), datetime.time(12, 0, 2),
                                        datetime.time(12, 0, 3)])
        prop5.extend([datetime.time(12, 0, 4)], strict=True)
        self.assertEqual(prop5.values, [datetime.time(12, 0, 1), datetime.time(12, 0, 2),
                                        datetime.time(12, 0, 3), datetime.time(12, 0, 4)])
        prop5.extend([datetime.time(12, 0, 5), datetime.time(12, 0, 6)], strict=True)
        self.assertEqual(prop5.values, [datetime.time(12, 0, 1), datetime.time(12, 0, 2),
                                        datetime.time(12, 0, 3), datetime.time(12, 0, 4),
                                        datetime.time(12, 0, 5), datetime.time(12, 0, 6)])
        with self.assertRaises(ValueError):
            prop4.extend(['12:00:07', 'abc'], strict=False)

        prop6 = Property(name="prop6", dtype="datetime",
                         values=['2011-12-01 12:00:01', '2011-12-01 12:00:02'])
        with self.assertRaises(ValueError):
            prop6.extend('2011-12-01 12:00:03', strict=True)
        self.assertEqual(prop6.values, [datetime.datetime(2011, 12, 1, 12, 0, 1),
                                        datetime.datetime(2011, 12, 1, 12, 0, 2)])
        prop6.extend('2011-12-01 12:00:03', strict=False)
        self.assertEqual(prop6.values, [datetime.datetime(2011, 12, 1, 12, 0, 1),
                                        datetime.datetime(2011, 12, 1, 12, 0, 2),
                                        datetime.datetime(2011, 12, 1, 12, 0, 3)])
        prop6.extend([datetime.datetime(2011, 12, 1, 12, 0, 4)], strict=True)
        self.assertEqual(prop6.values, [datetime.datetime(2011, 12, 1, 12, 0, 1),
                                        datetime.datetime(2011, 12, 1, 12, 0, 2),
                                        datetime.datetime(2011, 12, 1, 12, 0, 3),
                                        datetime.datetime(2011, 12, 1, 12, 0, 4)])
        prop6.extend([datetime.datetime(2011, 12, 1, 12, 0, 5),
                      datetime.datetime(2011, 12, 1, 12, 0, 6)], strict=True)
        self.assertEqual(prop6.values, [datetime.datetime(2011, 12, 1, 12, 0, 1),
                                        datetime.datetime(2011, 12, 1, 12, 0, 2),
                                        datetime.datetime(2011, 12, 1, 12, 0, 3),
                                        datetime.datetime(2011, 12, 1, 12, 0, 4),
                                        datetime.datetime(2011, 12, 1, 12, 0, 5),
                                        datetime.datetime(2011, 12, 1, 12, 0, 6)])
        with self.assertRaises(ValueError):
            prop4.extend(['2011-12-03 12:00:07', 'abc'], strict=False)
Esempio n. 35
0
    def test_merge(self):
        # -- Root level Section merge tests
        source = Section(name="source", definition="def", reference="ref")
        destination = Section(name="destination")

        destination.merge(source)
        self.assertEqual(destination.definition, source.definition)
        self.assertEqual(destination.reference, source.reference)

        # -- First child level Section merge tests
        s_sec_one = Section(name="lvl", type="one", definition="def", parent=source)
        s_sec_two = Section(name="other", type="one", parent=source)
        _ = Section(name="lvl", type="one", parent=destination)

        self.assertEqual(len(destination), 1)
        self.assertIsNone(destination.sections["lvl"].definition)
        self.assertIsNone(destination.sections["lvl"].reference)

        destination.merge(source)
        self.assertEqual(len(destination), 2)
        self.assertEqual(destination.sections["lvl"].definition, s_sec_one.definition)
        self.assertEqual(destination.sections["lvl"].reference, s_sec_one.reference)
        self.assertEqual(destination.sections["other"], s_sec_two)

        # -- Root level Property merge tests
        source = Section(name="source")
        destination = Section(name="destination")

        s_prop_one = Property(name="prop_one", unit="Hz", parent=source)
        s_prop_two = Property(name="prop_two", parent=source)
        _ = Property(name="prop_one", parent=destination)

        self.assertEqual(len(destination.properties), 1)
        self.assertIsNone(destination.properties["prop_one"].unit)

        destination.merge(source)
        self.assertEqual(len(destination.properties), 2)
        self.assertEqual(destination.properties["prop_one"].unit, s_prop_one.unit)
        self.assertEqual(destination.properties["prop_two"], s_prop_two)

        # -- First child level Property merge tests
        source = Section(name="source")
        destination = Section(name="destination")

        s_sec_one = Section(name="lvl", type="one", definition="def", parent=source)
        s_prop_one = Property(name="prop_one", unit="Hz", parent=s_sec_one)
        s_prop_two = Property(name="prop_two", parent=s_sec_one)

        d_sec_one = Section(name="lvl", type="one", parent=destination)
        _ = Property(name="prop_one", parent=d_sec_one)

        self.assertEqual(len(destination.properties), 0)
        self.assertEqual(len(destination.sections["lvl"].properties), 1)
        self.assertIsNone(destination.sections["lvl"].properties["prop_one"].unit)

        destination.merge(source)
        self.assertEqual(len(destination.properties), 0)
        self.assertEqual(len(destination.sections["lvl"].properties), 2)
        self.assertEqual(destination.sections["lvl"].properties["prop_one"].unit,
                         s_prop_one.unit)
        self.assertEqual(destination.sections["lvl"].properties["prop_two"],
                         s_prop_two)

        # -- Test nothing merged on second child level ValueError
        source = Section(name="source", definition="def", reference="ref")
        destination = Section(name="destination")

        s_sec_one = Section(name="lvl", type="one", definition="def", parent=source)
        _ = Section(name="other", type="one", parent=source)
        d_sec_one = Section(name="lvl", type="one", parent=destination)

        _ = Property(name="prop", value=[1, 2, 3], parent=s_sec_one)
        d_subprop_one = Property(name="prop", value=["four", "five"], parent=d_sec_one)

        self.assertEqual(len(destination.sections), 1)
        self.assertEqual(len(destination.sections["lvl"].properties), 1)
        self.assertIsNone(destination.definition)
        self.assertIsNone(destination.sections["lvl"].definition)
        self.assertEqual(destination.sections["lvl"].properties[0].values,
                         d_subprop_one.values)

        with self.assertRaises(ValueError):
            destination.merge(source)

        self.assertEqual(len(destination.sections), 1)
        self.assertEqual(len(destination.sections["lvl"].properties), 1)
        self.assertIsNone(destination.definition)
        self.assertIsNone(destination.sections["lvl"].definition)
        self.assertEqual(destination.sections["lvl"].properties[0].values,
                         d_subprop_one.values)
Esempio n. 36
0
    def test_reorder(self):
        sec = Section()
        prop_zero = Property(name="prop_zero", parent=sec)
        prop_one = Property(name="prop_one", parent=sec)
        prop_two = Property(name="prop_two", parent=sec)
        prop_three = Property(name="prop_three", parent=sec)

        self.assertEqual(sec.properties[0].name, prop_zero.name)
        self.assertEqual(sec.properties[2].name, prop_two.name)
        prop_two.reorder(0)

        self.assertEqual(sec.properties[0].name, prop_two.name)
        self.assertEqual(sec.properties[1].name, prop_zero.name)
        self.assertEqual(sec.properties[2].name, prop_one.name)
        self.assertEqual(sec.properties[3].name, prop_three.name)

        prop_two.reorder(2)

        self.assertEqual(sec.properties[0].name, prop_zero.name)
        self.assertEqual(sec.properties[1].name, prop_one.name)
        self.assertEqual(sec.properties[2].name, prop_two.name)
        self.assertEqual(sec.properties[3].name, prop_three.name)

        # Test Exception on unconnected property
        prop = Property(name="main")
        with self.assertRaises(ValueError):
            prop.reorder(0)
Esempio n. 37
0
 def test_int(self):
     p = Property("test", value=111)
     assert (p.dtype == "int")
     assert isinstance(p.values[0], int)
Esempio n. 38
0
    def test_value(self):
        prop = Property("property", 100)
        self.assertEqual(prop.values[0], 100)
        self.assertIsInstance(prop.values, list)

        prop.values = None
        self.assertEqual(len(prop), 0)

        prop.values = [1, 2, 3]
        prop.values = ""
        self.assertEqual(len(prop), 0)

        prop.values = [1, 2, 3]
        prop.values = []
        self.assertEqual(len(prop), 0)

        prop.values = [1, 2, 3]
        prop.values = ()
        self.assertEqual(len(prop), 0)

        prop.values.append(5)
        self.assertEqual(len(prop.values), 0)

        prop2 = Property("test", {"name": "Marie"})
        self.assertEqual(len(prop2), 1)

        # Test tuple dtype value.
        prop_tuple = Property(name="Location", value='(39.12; 67.19)', dtype='2-tuple')
        tuple_value = prop_tuple.values[0]  # As the formed tuple is a list of list
        self.assertEqual(tuple_value[0], '39.12')
        self.assertEqual(tuple_value[1], '67.19')

        # Test invalid tuple length
        with self.assertRaises(ValueError):
            _ = Property(name="Public-Key", value='(5689; 1254; 687)', dtype='2-tuple')

        prop3 = Property('myprop', value=0, dtype=DType.int)
        self.assertEqual(prop3.value, [0])
        self.assertEqual(prop3.values, [0])

        prop4 = Property('myprop', value=0, dtype=DType.boolean)
        self.assertEqual(prop4.value, [False])
        self.assertEqual(prop4.values, [False])

        prop5 = Property('myprop', value=0)
        self.assertEqual(prop5.value, [0])
        self.assertEqual(prop5.values, [0])

        with self.assertRaises(ValueError):
            Property(name="dateprop", dtype=DType.date, value=['20190707'])

        with self.assertRaises(ValueError):
            Property(name="timeprop", dtype=DType.time, value=['11.11.11'])

        with self.assertRaises(ValueError):
            Property(name="datetimeprop", dtype=DType.datetime, value=['20190707'])

        with self.assertRaises(ValueError):
            Property(name="intprop", dtype=DType.int, value=[2, "Hello!", 4])

        prop6 = Property('myprop', values=["(8; 9; 10)", "(11; 12; 13)"], dtype="3-tuple")
        self.assertEqual(len(prop6.values), 2)

        prop7 = Property('myprop', values=[["0", "1", "2"], [3, 4, 5]], dtype="3-tuple")
        self.assertEqual(len(prop7.values), 2)

        prop8 = Property('myprop', values=["(8; 9; 10)", ["0", "1", "2"], [3, 4, 5]], dtype="3-tuple")
        self.assertEqual(len(prop8.values), 3)
Esempio n. 39
0
    def test_comparison(self):
        sec_name = "sec name"
        sec_type = "sec type"
        sec_def = "an odml test section"
        sec_ref = "from over there"

        sec_a = Section(name=sec_name, type=sec_type,
                        definition=sec_def, reference=sec_ref)
        sec_b = Section(name=sec_name, type=sec_type,
                        definition=sec_def, reference=sec_ref)

        self.assertEqual(sec_a, sec_b)

        sec_b.name = "newSecName"
        self.assertNotEqual(sec_a, sec_b)

        sec_b.name = sec_name

        # Test section equality with subsections

        # Test equality with subsection of different entities
        # with same content and same children order
        subsec_aa = Section(name="subsecA", type=sec_type,
                            definition=sec_def, reference=sec_ref)
        subsec_ab = Section(name="subsecB", type=sec_type,
                            definition=sec_def, reference=sec_ref)
        subsec_ba = Section(name="subsecA", type=sec_type,
                            definition=sec_def, reference=sec_ref)
        subsec_bb = Section(name="subsecB", type=sec_type,
                            definition=sec_def, reference=sec_ref)

        sec_a.extend([subsec_aa, subsec_ab])
        sec_b.extend([subsec_ba, subsec_bb])

        self.assertEqual(sec_a, sec_b)
        self.assertEqual(sec_a.sections, sec_b.sections)

        sec_b.sections[0].name = "newSubsecA"
        self.assertNotEqual(sec_a, sec_b)
        self.assertNotEqual(sec_a.sections, sec_b.sections)

        sec_b.sections[0].name = "subsecA"

        # Test inequality with different number of children
        sec_b.remove(sec_b.sections[1])
        self.assertNotEqual(sec_a, sec_b)
        self.assertNotEqual(sec_a.sections, sec_b.sections)

        # Test equality with subsection of different entities
        # with same content and different children order
        sec_b.remove(sec_b.sections[0])
        sec_b.extend([subsec_bb, subsec_ba])

        self.assertEqual(sec_a, sec_b)
        self.assertEqual(sec_a.sections, sec_b.sections)

        sec_b.sections[0].name = "newSubsecB"
        self.assertNotEqual(sec_a, sec_b)
        self.assertNotEqual(sec_a.sections, sec_b.sections)

        sec_b.sections[0].name = "subsecB"

        # Test section equality with properties

        # Test equality with properties of different entities
        # with same content and same children order
        prop_aa = Property(name="propA", definition="propDef")
        prop_ab = Property(name="propB", definition="propDef")
        prop_ba = Property(name="propA", definition="propDef")
        prop_bb = Property(name="propB", definition="propDef")

        sec_a.extend([prop_aa, prop_ab])
        sec_b.extend([prop_ba, prop_bb])

        self.assertEqual(sec_a, sec_b)
        self.assertEqual(sec_a.properties, sec_b.properties)

        sec_b.properties[0].name = "newPropA"
        self.assertNotEqual(sec_a, sec_b)
        self.assertNotEqual(sec_a.properties, sec_b.properties)

        sec_b.properties[0].name = "propA"

        # Test inequality with different number of children
        sec_b.remove(sec_b.properties[1])
        self.assertNotEqual(sec_a, sec_b)
        self.assertNotEqual(sec_a.properties, sec_b.properties)

        # Test equality with properties of different entities
        # with same content and different children order
        sec_b.remove(sec_b.properties[0])
        sec_b.extend([prop_bb, prop_ba])

        self.assertEqual(sec_a, sec_b)
        self.assertEqual(sec_a.properties, sec_b.properties)

        sec_b.properties[0].name = "newPropB"
        self.assertNotEqual(sec_a, sec_b)
        self.assertNotEqual(sec_a.properties, sec_b.properties)
Esempio n. 40
0
    def test_dtype(self):
        prop = Property(name="prop")

        # Test assignment of all supported dtypes.
        for curr_type in DType:
            prop.dtype = curr_type
            self.assertEqual(prop.dtype, curr_type)

        # Test assignment of dtype alias.
        prop.dtype = "bool"
        self.assertEqual(prop.dtype, "bool")
        prop.dtype = "str"
        self.assertEqual(prop.dtype, "str")

        # Test assignment of tuple.
        prop.dtype = "2-tuple"
        self.assertEqual(prop.dtype, "2-tuple")

        # Test set None
        prop.dtype = None
        self.assertIsNone(prop.dtype)

        # Test assignment fails.
        with self.assertRaises(AttributeError):
            prop.dtype = 1
        with self.assertRaises(AttributeError):
            prop.dtype = "crash and burn"
        with self.assertRaises(AttributeError):
            prop.dtype = "x-tuple"

        # Test not setting None when a property contains values.
        prop.values = [1, 2, 3]
        self.assertIsNotNone(prop.dtype)
        prop.dtype = None
        self.assertIsNotNone(prop.dtype)
Esempio n. 41
0
 def test_float(self):
     p = Property("test", value=3.14)
     assert(p.dtype == "float")
     assert(type(p.value[0]) == float)
Esempio n. 42
0
    def test_merge(self):
        p_dst = Property("p1", value=[1, 2, 3], unit="Hz",
                         definition="Freude\t schoener\nGoetterfunken\n",
                         reference="portal.g-node.org", uncertainty=0.0, value_origin="file")
        p_src = Property("p2", value=[2, 4, 6], unit="Hz",
                         definition="FREUDE schoener GOETTERfunken")

        test_p = p_dst.clone()
        test_p.merge(p_src)
        self.assertEqual(len(test_p.values), 5)

        p_inv_unit = p_src.clone()
        p_inv_unit.unit = 's'

        p_inv_def = p_src.clone()
        p_inv_def.definition = "Freunde schoender Goetterfunken"

        p_inv_uncert = p_src.clone()
        p_inv_uncert.uncertainty = 10.0

        p_inv_ref = p_src.clone()
        p_inv_ref.reference = "test"

        p_inv_origin = p_src.clone()
        p_inv_origin.value_origin = "other file"

        test_p = p_dst.clone()
        self.assertRaises(ValueError, test_p.merge, p_inv_unit)
        self.assertRaises(ValueError, test_p.merge, p_inv_def)
        self.assertRaises(ValueError, test_p.merge, p_inv_uncert)
        self.assertRaises(ValueError, test_p.merge, p_inv_ref)
        self.assertRaises(ValueError, test_p.merge, p_inv_origin)

        test_p.reference = None
        test_p.merge(p_src)
        self.assertEqual(test_p.reference, p_src.reference)

        test_p.unit = ""
        test_p.merge(p_src)
        self.assertEqual(test_p.unit, p_src.unit)

        test_p.uncertainty = None
        test_p.merge(p_src)
        self.assertEqual(test_p.uncertainty, p_src.uncertainty)

        test_p.definition = ""
        test_p.merge(p_src)
        self.assertEqual(test_p.definition, p_src.definition)

        test_p.value_origin = ""
        test_p.merge(p_src)
        self.assertEqual(test_p.value_origin, p_src.value_origin)

        double_p = Property("adouble", value=3.14)
        int_p = Property("aint", value=3)
        self.assertRaises(ValueError, double_p.merge, int_p)

        int_p.merge(double_p, strict=False)
        self.assertEqual(len(int_p), 2)
Esempio n. 43
0
 def test_datetime(self):
     p = Property("test", value=dt.now())
     assert(p.dtype == "datetime")
     assert(type(p.value[0]) == dt)
Esempio n. 44
0
 def test_int(self):
     p = Property("test", value=111)
     assert (p.dtype == "int")
     assert (type(p.value[0]) == int)
Esempio n. 45
0
    def test_simple_attributes(self):
        p_name = "propertyName"
        p_origin = "from over there"
        p_unit = "pears"
        p_uncertainty = "12"
        p_ref = "4 8 15 16 23"
        p_def = "an odml test property"
        p_dep = "yes"
        p_dep_val = "42"

        prop = Property(name=p_name, value_origin=p_origin, unit=p_unit,
                        uncertainty=p_uncertainty, reference=p_ref, definition=p_def,
                        dependency=p_dep, dependency_value=p_dep_val)

        self.assertEqual(prop.name, p_name)
        self.assertEqual(prop.value_origin, p_origin)
        self.assertEqual(prop.unit, p_unit)
        self.assertEqual(prop.uncertainty, p_uncertainty)
        self.assertEqual(prop.reference, p_ref)
        self.assertEqual(prop.definition, p_def)
        self.assertEqual(prop.dependency, p_dep)
        self.assertEqual(prop.dependency_value, p_dep_val)

        # Test setting attributes
        prop.name = "%s_edit" % p_name
        self.assertEqual(prop.name, "%s_edit" % p_name)
        prop.value_origin = "%s_edit" % p_origin
        self.assertEqual(prop.value_origin, "%s_edit" % p_origin)
        prop.unit = "%s_edit" % p_unit
        self.assertEqual(prop.unit, "%s_edit" % p_unit)
        prop.uncertainty = 13
        self.assertEqual(prop.uncertainty, 13.0)
        prop.reference = "%s_edit" % p_ref
        self.assertEqual(prop.reference, "%s_edit" % p_ref)
        prop.definition = "%s_edit" % p_def
        self.assertEqual(prop.definition, "%s_edit" % p_def)
        prop.dependency = "%s_edit" % p_dep
        self.assertEqual(prop.dependency, "%s_edit" % p_dep)
        prop.dependency_value = "%s_edit" % p_dep_val
        self.assertEqual(prop.dependency_value, "%s_edit" % p_dep_val)

        # Test setting attributes to None when '' is passed.
        prop.value_origin = ""
        self.assertIsNone(prop.value_origin)
        prop.unit = ""
        self.assertIsNone(prop.unit)
        prop.uncertainty = ""
        self.assertIsNone(prop.uncertainty)
        prop.reference = ""
        self.assertIsNone(prop.reference)
        prop.definition = ""
        self.assertIsNone(prop.definition)
        prop.dependency = ""
        self.assertIsNone(prop.dependency)
        prop.dependency_value = ""
        self.assertIsNone(prop.dependency_value)
Esempio n. 46
0
    def test_merge_check(self):
        # -- Root level Section checks

        # Test empty Section check
        source = Section(name="source")
        destination = Section(name="destination")

        destination.merge_check(source, True)

        # Test definition check
        source = Section(name="source", definition="def")
        destination = Section(name="destination", definition="def")

        destination.merge_check(source, True)
        source.definition = "other def"
        with self.assertRaises(ValueError):
            destination.merge_check(source, True)

        # Test reference check
        source = Section(name="source", reference="ref")
        destination = Section(name="destination", reference="ref")

        destination.merge_check(source, True)
        source.reference = "other ref"
        with self.assertRaises(ValueError):
            destination.merge_check(source, True)

        # -- First child level Section checks
        source = Section(name="source")
        destination = Section(name="destination")

        s_sec_one = Section(name="lvl", type="one",
                            reference="ref", definition="def", parent=source)
        s_sec_two = Section(name="unrelated", type="one",
                            reference="one", definition="one", parent=source)

        d_sec_one = Section(name="lvl", type="one",
                            reference="ref", definition="def", parent=destination)
        d_sec_two = Section(name="unrelated", type="two",
                            reference="two", definition="two", parent=destination)

        # Test Section child level definition check
        destination.merge_check(source, True)
        s_sec_one.definition = "other def"
        with self.assertRaises(ValueError):
            destination.merge_check(source, True)

        # Test Section child level reference check
        s_sec_one.definition = "def"
        s_sec_one.reference = "other ref"
        with self.assertRaises(ValueError):
            destination.merge_check(source, True)

        # -- Second child level Section checks
        source = Section(name="source")
        destination = Section(name="destination")

        s_sec_one = Section(name="lvl", type="one",
                            reference="ref", definition="def", parent=source)
        s_subsec_one = Section(name="lvl", type="two",
                               reference="ref2", definition="def2", parent=s_sec_one)
        s_sec_two = Section(name="unrelated", type="one",
                            reference="one", definition="one", parent=source)
        s_subsec_two = Section(name="lvl", type="two",
                               reference="none1", definition="none1", parent=s_sec_two)

        d_sec_one = Section(name="lvl", type="one",
                            reference="ref", definition="def", parent=destination)
        d_subsec_one = Section(name="lvl", type="two",
                               reference="ref2", definition="def2", parent=d_sec_one)
        d_sec_two = Section(name="unrelated", type="two",
                            reference="two", definition="two", parent=destination)
        d_subsec_two = Section(name="lvl", type="two",
                               reference="none2", definition="none2", parent=d_sec_two)

        # Test Section 2nd child level definition check
        # Check no definition/reference ValueError between s_subsec_two and d_subsec_one
        # since their parents will not be merged.
        destination.merge_check(source, True)

        # Raise a definition ValueError between s_subsec_one and d_subsec_one
        # since their parents will be merged.
        s_subsec_one.definition = "other def"
        with self.assertRaises(ValueError):
            destination.merge_check(source, True)

        # Test Section 2nd child level reference check
        s_subsec_one.definition = "def2"

        # Raise a reference ValueError between s_subsec_one and d_subsec_one
        # since their parents will be merged.
        s_subsec_one.reference = "other ref"
        with self.assertRaises(ValueError):
            destination.merge_check(source, True)

        # -- Root level Property checks
        # All Property checks will only test unit failure in the Section merge context.
        # Other failures are covered by the specific Property merge check tests.
        source = Section(name="source")
        destination = Section(name="destination")

        s_prop = Property(name="prop", parent=source)
        d_prop = Property(name="prop", parent=destination)

        destination.merge_check(source, True)
        s_prop.unit = "Hz"
        d_prop.unit = "s"
        with self.assertRaises(ValueError):
            destination.merge_check(source, True)

        # -- First child level Property checks
        source = Section(name="source")
        destination = Section(name="destination")

        s_prop_one = Property(name="lvl one", unit="Hz", parent=source)
        s_prop_two = Property(name="unrelated one", unit="one", parent=source)

        d_prop_one = Property(name="lvl one", unit="Hz", parent=destination)
        d_prop_two = Property(name="unrelated two", unit="two", parent=destination)

        # Test Property child level check
        destination.merge_check(source, True)

        # Test raise ValueError between s_prop_one and d_prop_one
        s_prop_one.unit = "other unit"
        with self.assertRaises(ValueError):
            destination.merge_check(source, True)

        # -- Second child level Property checks
        source = Section(name="source")
        destination = Section(name="destination")

        s_sec_one = Section(name="lvl", type="one", parent=source)
        s_subprop_one = Property(name="lvl one", unit="Hz", parent=s_sec_one)

        s_sec_two = Section(name="unrelated", type="one", parent=source)
        s_subprop_two = Property(name="unrelated one", unit="one", parent=s_sec_two)

        d_sec_one = Section(name="lvl", type="one", parent=destination)
        d_subprop_one = Property(name="lvl one", unit="Hz", parent=d_sec_one)

        d_sec_two = Section(name="unrelated", type="two", parent=destination)
        d_subprop_two = Property(name="unrelated one", unit="two", parent=d_sec_two)

        # Test Property 2nd child level definition check
        # Check no unit ValueError between s_subprop_two and d_subprop_one
        # since their parents will not be merged.
        destination.merge_check(source, True)

        # Raise a unit ValueError between s_subprop_one and d_subprop_one
        # since their parents will be merged.
        s_subprop_one.unit = "other unit"
        with self.assertRaises(ValueError):
            destination.merge_check(source, True)
    def test_value(self):
        p = Property("property", 100)
        self.assertEqual(p.values[0], 100)
        self.assertIsInstance(p.values, list)

        p.values = None
        self.assertEqual(len(p), 0)

        p.values = [1, 2, 3]
        p.values = ""
        self.assertEqual(len(p), 0)

        p.values = [1, 2, 3]
        p.values = []
        self.assertEqual(len(p), 0)

        p.values = [1, 2, 3]
        p.values = ()
        self.assertEqual(len(p), 0)

        p.values.append(5)
        self.assertEqual(len(p.values), 0)

        p2 = Property("test", {"name": "Marie", "name": "Johanna"})
        self.assertEqual(len(p2), 1)

        # Test tuple dtype value.
        t = Property(name="Location", value='(39.12; 67.19)', dtype='2-tuple')
        tuple_value = t.values[0]  # As the formed tuple is a list of list
        self.assertEqual(tuple_value[0], '39.12')
        self.assertEqual(tuple_value[1], '67.19')

        # Test invalid tuple length
        with self.assertRaises(ValueError):
            _ = Property(name="Public-Key", value='(5689; 1254; 687)', dtype='2-tuple')