def test_iterators(self):
        kp = Parameters(json_string)

        #iteration by range
        nitems = 0
        for iterator in kp:
            nitems = nitems + 1
        self.assertEqual(nitems, 5)

        #iteration by items
        for key, value in kp.items():
            #print(value.PrettyPrintJsonString())
            self.assertEqual(kp[key].PrettyPrintJsonString(),
                             value.PrettyPrintJsonString())
            #print(key,value)

        #testing values
        expected_values = [
            '10', '2.0', 'true', '"hello"',
            '{"list_value":[3,"hi",false],"tmp":5.0}'
        ]
        counter = 0

        for value in kp.values():
            self.assertEqual(value.WriteJsonString(), expected_values[counter])
            counter += 1

        #testing values
        expected_keys = [
            'int_value', 'double_value', 'bool_value', 'string_value', 'level1'
        ]
        counter = 0
        for key in kp.keys():
            self.assertEqual(key, expected_keys[counter])
            counter += 1
    def test_is_methods(self):
        # This method checks all the "IsXXX" Methods
        tmp = Parameters(
            """{
            "int_value" : 10,   
            "double_value": 2.0,   
            "bool_value" : true,   
            "string_value" : "hello",
            "vector_value" : [5,3,4], 
            "matrix_value" : [[1,2],[3,6]]
        }"""
        )  # if you add more values to this, make sure to add the corresponding in the loop

        for key in tmp.keys():
            val_type = key[:-6]  # removing "_value"

            if val_type == "int":
                self.assertTrue(tmp[key].IsInt())
            else:
                self.assertFalse(tmp[key].IsInt())

            if val_type == "double":
                self.assertTrue(tmp[key].IsDouble())
            else:
                self.assertFalse(tmp[key].IsDouble())

            if val_type == "bool":
                self.assertTrue(tmp[key].IsBool())
            else:
                self.assertFalse(tmp[key].IsBool())

            if val_type == "string":
                self.assertTrue(tmp[key].IsString())
            else:
                self.assertFalse(tmp[key].IsString())

            if val_type == "vector":
                self.assertTrue(tmp[key].IsVector())
            else:
                self.assertFalse(tmp[key].IsVector())

            if val_type == "matrix":
                self.assertTrue(tmp[key].IsMatrix())
            else:
                self.assertFalse(tmp[key].IsMatrix())
    def test_is_methods(self):
        # This method checks all the "IsXXX" Methods
        tmp = Parameters(
            """{
            "int_value" : 10, /* This is comment to check that comments work */
            "double_value": 2.0, // This is comment too, but using another comment
            "bool_value" : true, // This is another comment being meta as realizing that all the possibilities are already check
            "string_value" : "hello",/* This is a nihilist comment about the futile existence of the previous comment as a metacomment */
            "vector_value" : [5,3,4],
            "matrix_value" : [[1,2],[3,6]]
        }"""
        )  # if you add more values to this, make sure to add the corresponding in the loop

        for key in tmp.keys():
            val_type = key[:-6]  # removing "_value"

            if val_type == "int":
                self.assertTrue(tmp[key].IsInt())
            else:
                self.assertFalse(tmp[key].IsInt())

            if val_type == "double":
                self.assertTrue(tmp[key].IsDouble())
            else:
                self.assertFalse(tmp[key].IsDouble())

            if val_type == "bool":
                self.assertTrue(tmp[key].IsBool())
            else:
                self.assertFalse(tmp[key].IsBool())

            if val_type == "string":
                self.assertTrue(tmp[key].IsString())
            else:
                self.assertFalse(tmp[key].IsString())

            if val_type == "vector":
                self.assertTrue(tmp[key].IsVector())
            else:
                self.assertFalse(tmp[key].IsVector())

            if val_type == "matrix":
                self.assertTrue(tmp[key].IsMatrix())
            else:
                self.assertFalse(tmp[key].IsMatrix())
    def test_get_methods(self):
        # This method checks all the "GetXXX" Methods if they throw an error
        tmp = Parameters(
            """{
            "int_value" : 10,   
            "double_value": 2.0,   
            "bool_value" : true,   
            "string_value" : "hello",
            "vector_value" : [5.2,-3.1,4.33], 
            "matrix_value" : [[1,2],[3,4],[5,6]]
        }"""
        )  # if you add more values to this, make sure to add the corresponding in the loop

        for key in tmp.keys():
            val_type = key[:-6]  # removing "_value"

            # Int and Double are checked tgth bcs both internally call "IsNumber"
            if val_type == "int" or val_type == "double":
                if val_type == "int":
                    self.assertEqual(tmp[key].GetInt(), 10)
            else:
                with self.assertRaises(RuntimeError):
                    tmp[key].GetInt()

            if val_type == "double" or val_type == "int":
                if val_type == "double":
                    self.assertEqual(tmp[key].GetDouble(), 2.0)
            else:
                with self.assertRaises(RuntimeError):
                    tmp[key].GetDouble()

            if val_type == "bool":
                self.assertEqual(tmp[key].GetBool(), True)
            else:
                with self.assertRaises(RuntimeError):
                    tmp[key].GetBool()

            if val_type == "string":
                self.assertEqual(tmp[key].GetString(), "hello")
            else:
                with self.assertRaises(RuntimeError):
                    tmp[key].GetString()

            if val_type == "vector":
                V = tmp[key].GetVector()
                self.assertEqual(V[0], 5.2)
                self.assertEqual(V[1], -3.1)
                self.assertEqual(V[2], 4.33)
            else:
                with self.assertRaises(RuntimeError):
                    tmp[key].GetVector()

            if val_type == "matrix":
                A = tmp[key].GetMatrix()
                self.assertEqual(A[0, 0], 1.0)
                self.assertEqual(A[0, 1], 2.0)
                self.assertEqual(A[1, 0], 3.0)
                self.assertEqual(A[1, 1], 4.0)
                self.assertEqual(A[2, 0], 5.0)
                self.assertEqual(A[2, 1], 6.0)
            else:
                with self.assertRaises(RuntimeError):
                    tmp[key].GetMatrix()
    def test_set_methods(self):
        # This method checks all the "GetXXX" Methods if they throw an error
        tmp = Parameters(
            """{
            "int_value" : 0,
            "double_value": 0.0,
            "bool_value" : false,
            "string_value" : "",
            "vector_value" : [],
            "matrix_value" : [[0]]
        }"""
        )  # if you add more values to this, make sure to add the corresponding in the loop

        for key in tmp.keys():
            val_type = key[:-6]  # removing "_value"

            # Int and Double are checked tgth bcs both internally call "IsNumber"
            if val_type == "int" or val_type == "double":
                if val_type == "int":
                    tmp[key].SetInt(10)
                    self.assertEqual(tmp[key].GetInt(), 10)
            else:
                with self.assertRaises(RuntimeError):
                    tmp[key].GetInt()

            if val_type == "double" or val_type == "int":
                if val_type == "double":
                    tmp[key].SetDouble(2.0)
                    self.assertEqual(tmp[key].GetDouble(), 2.0)
            else:
                with self.assertRaises(RuntimeError):
                    tmp[key].GetDouble()

            if val_type == "bool":
                tmp[key].SetBool(True)
                self.assertEqual(tmp[key].GetBool(), True)
            else:
                with self.assertRaises(RuntimeError):
                    tmp[key].GetBool()

            if val_type == "string":
                tmp[key].SetString("hello")
                self.assertEqual(tmp[key].GetString(), "hello")
            else:
                with self.assertRaises(RuntimeError):
                    tmp[key].GetString()

            if val_type == "vector":
                vector = Vector(3)
                vector[0] = 5.2
                vector[1] = -3.1
                vector[2] = 4.33
                tmp[key].SetVector(vector)
                V = tmp[key].GetVector()
                self.assertEqual(V[0], 5.2)
                self.assertEqual(V[1], -3.1)
                self.assertEqual(V[2], 4.33)
            else:
                with self.assertRaises(RuntimeError):
                    tmp[key].GetVector()

            if val_type == "matrix":
                matrix = Matrix(3, 2)
                matrix[0, 0] = 1.0
                matrix[0, 1] = 2.0
                matrix[1, 0] = 3.0
                matrix[1, 1] = 4.0
                matrix[2, 0] = 5.0
                matrix[2, 1] = 6.0
                tmp[key].SetMatrix(matrix)
                A = tmp[key].GetMatrix()
                self.assertEqual(A[0, 0], 1.0)
                self.assertEqual(A[0, 1], 2.0)
                self.assertEqual(A[1, 0], 3.0)
                self.assertEqual(A[1, 1], 4.0)
                self.assertEqual(A[2, 0], 5.0)
                self.assertEqual(A[2, 1], 6.0)
            else:
                with self.assertRaises(RuntimeError):
                    tmp[key].GetMatrix()