import unittest
import sys
import os

from utils import execute, kill, run_file, run_barebone

def flatten(lst):
    new_lst = []
    for f in lst:
        if isinstance(f, (list, tuple)):
            new_lst.extend(flatten(f))
        else:
            new_lst.append(f)
    return new_lst

class TestConstructorsModels(unittest.TestCase):
    def test_constructors_instantiate_bottom(self):
        commands = ['"instantiate_bottom"',
                        '"node"', '"Class"', 'true',
                        '"value"', '"Type"', '{"value": "Type"}', 'true',
                        '"value"', '"__String"', '{"value": "String"}', 'true',
                        '"value"', '"__name"', '"name"', 'true',
                        '"edge"', '"Attribute"', '"Class"', '"Type"', 'true',
                        '"edge"', '"__Name"', '"Attribute"', '"__String"', 'true',
                        '"edge"', '"Association"', '"Class"', '"Class"', 'true',
                        '"edge"', '"Inheritance"', '"Class"', '"Class"', 'true',
                        '"edge"', '"__name_edge"', '"__Name"', '"__name"', 'true',
                        '"edge"', '"__inh_1"', '"Association"', '"Class"', 'true',
                        '"edge"', '"__inh_2"', '"Attribute"', '"Class"', 'true',
                        '"value"', '"__attribute"', '"attribute"', 'true',
                        '"edge"', '"__attribute_edge"', '"Attribute"', '"__attribute"', 'false',
                    1,
                    '"output"', '"const"', '3',
                        'true',
                    '"return"', 'true',
                        '"const"', 'true',
                ]
        self.assertTrue(run_barebone(flatten(commands), ['3'], 1))

    def test_constructors_instantiate_model(self):
        commands = ['"instantiate_bottom"',
                        '"node"', '"Class"', 'true',
                        '"value"', '"Type"', '{"value": "Type"}', 'true',
                        '"value"', '"__String"', '{"value": "String"}', 'true',
                        '"value"', '"__name"', '"name"', 'true',
                        '"edge"', '"Attribute"', '"Class"', '"Type"', 'true',
                        '"edge"', '"__Name"', '"Attribute"', '"__String"', 'true',
                        '"edge"', '"Association"', '"Class"', '"Class"', 'true',
                        '"edge"', '"Inheritance"', '"Class"', '"Class"', 'true',
                        '"edge"', '"__name_edge"', '"__Name"', '"__name"', 'true',
                        '"edge"', '"__inh_1"', '"Association"', '"Class"', 'true',
                        '"edge"', '"__inh_2"', '"Attribute"', '"Class"', 'true',
                        '"value"', '"__attribute"', '"attribute"', 'true',
                        '"edge"', '"__attribute_edge"', '"Attribute"', '"__attribute"', 'false',
                    1,
                    '"instantiate_model"',
                        1,
                        1, '"Inheritance"',
                        '"Class"', '"Place"',
                            'true',
                                '"tokens"', '{"value": "Integer"}', 'false',
                            'false',
                            'true',
                        '"Class"', '"Transition"',
                            'false',
                            'false',
                            'true',
                        '"Association"', '"P2T"', '"Place"', '"Transition"',
                            'true',
                                '"weight"', '{"value": "Integer"}', 'false',
                            'false',
                            'true',
                        '"Association"', '"T2P"', '"Transition"', '"Place"',
                            'true',
                                '"weight"', '{"value": "Integer"}', 'false',
                            'false',
                            'false',
                    2,
                    '"instantiate_model"',
                        2,
                        1, '"Inheritance"',
                        '"Place"', '"p1"',
                            'false',
                            'true',
                                '"tokens"', '5', 'false',
                            'true',
                        '"Transition"', '"t1"',
                            'false',
                            'false',
                            'true',
                        '"P2T"', '""', '"p1"', '"t1"',
                            'false',
                            'true',
                                '"weight"', '1', 'false',
                            'true',
                        '"T2P"', '""', '"t1"', '"p1"',
                            'false',
                            'true',
                                '"weight"', '2', 'false',
                            'false',
                    3,
                    '"output"', '"const"', '3',
                        'true',
                    '"return"', 'true',
                        '"const"', 'true',
                ]
        self.assertTrue(run_barebone(flatten(commands), ['3'], 1))

    def test_constructors_retype_model(self):
        commands = ['"instantiate_bottom"',
                        '"node"', '"Class"', 'true',
                        '"value"', '"Type"', '{"value": "Type"}', 'true',
                        '"value"', '"__String"', '{"value": "String"}', 'true',
                        '"value"', '"__name"', '"name"', 'true',
                        '"edge"', '"Attribute"', '"Class"', '"Type"', 'true',
                        '"edge"', '"__Name"', '"Attribute"', '"__String"', 'true',
                        '"edge"', '"Association"', '"Class"', '"Class"', 'true',
                        '"edge"', '"Inheritance"', '"Class"', '"Class"', 'true',
                        '"edge"', '"__name_edge"', '"__Name"', '"__name"', 'true',
                        '"edge"', '"__inh_1"', '"Association"', '"Class"', 'true',
                        '"edge"', '"__inh_2"', '"Attribute"', '"Class"', 'true',
                        '"value"', '"__attribute"', '"attribute"', 'true',
                        '"edge"', '"__attribute_edge"', '"Attribute"', '"__attribute"', 'false',
                    1,
                    '"retype_model"',
                        1,
                        1,
                        1, '"Inheritance"',
                        'true',
                            '"Class"', '"Class"', 'true',
                            '"Type"', '"Type"', 'true',
                            '"__String"', '"Type"', 'true',
                            '"Attribute"', '"Attribute"', 'true',
                            '"__Name"', '"Attribute"', 'true',
                            '"Association"', '"Association"', 'true',
                            '"Inheritance"', '"Association"', 'true',
                            '"__inh_1"', '"Inheritance"', 'true',
                            '"__inh2"', '"Inheritance"', 'true',
                            '"__name"', '"__String"', 'true',
                            '"__name_edge"', '"__Name"', 'true',
                            '"__attribute"', '"__String"', 'true',
                            '"__attribute_edge"', '"__Name"', 'false',
                    '"output"', '"const"', '3',
                        'true',
                    '"return"', 'true',
                        '"const"', 'true',
                ]
        self.assertTrue(run_barebone(flatten(commands), ['3'], 1))

    def test_constructors_instantiate_model_inheritance(self):
        commands = ['"instantiate_bottom"',
                        '"node"', '"Class"', 'true',
                        '"value"', '"Type"', '{"value": "Type"}', 'true',
                        '"value"', '"__String"', '{"value": "String"}', 'true',
                        '"value"', '"__name"', '"name"', 'true',
                        '"edge"', '"Attribute"', '"Class"', '"Type"', 'true',
                        '"edge"', '"__Name"', '"Attribute"', '"__String"', 'true',
                        '"edge"', '"Association"', '"Class"', '"Class"', 'true',
                        '"edge"', '"Inheritance"', '"Class"', '"Class"', 'true',
                        '"edge"', '"__name_edge"', '"__Name"', '"__name"', 'true',
                        '"edge"', '"__inh_1"', '"Association"', '"Class"', 'true',
                        '"edge"', '"__inh_2"', '"Attribute"', '"Class"', 'true',
                        '"value"', '"__attribute"', '"attribute"', 'true',
                        '"edge"', '"__attribute_edge"', '"Attribute"', '"__attribute"', 'false',
                    1,
                    '"instantiate_model"',
                        1,
                        1, '"Inheritance"',
                        '"Class"', '"A"',
                            'true',
                                '"a"', '{"value": "Integer"}', 'false',
                            'false',
                            'true',
                        '"Class"', '"B"',
                            'true',
                                '"b"', '{"value": "Integer"}', 'false',
                            'false',
                            'true',
                        '"Inheritance"', '"b_inherits_from_a"', '"B"', '"A"',
                            'false',
                            'false',
                            'false',
                    2,
                    '"instantiate_model"',
                        2,
                        1, '"Inheritance"',
                        '"A"', '"a1"',
                            'false',
                            'true',
                                '"a"', '1', 'false',
                            'true',
                        '"B"', '"b1"',
                            'false',
                            'true',
                                '"a"', '2', 'true',
                                '"b"', '3', 'false',
                            'false',
                    3,
                    '"output"', '"const"', '3',
                        'true',
                    '"return"', 'true',
                        '"const"', 'true',
                ]
        self.assertTrue(run_barebone(flatten(commands), ['3'], 1))

    def test_constructors_conformance_metametamodel(self):
        commands = ['"instantiate_bottom"',
                        '"node"', '"Class"', 'true',
                        '"value"', '"Type"', '{"value": "Type"}', 'true',
                        '"value"', '"__String"', '{"value": "String"}', 'true',
                        '"value"', '"__name"', '"name"', 'true',
                        '"edge"', '"Attribute"', '"Class"', '"Type"', 'true',
                        '"edge"', '"__Name"', '"Attribute"', '"__String"', 'true',
                        '"edge"', '"Association"', '"Class"', '"Class"', 'true',
                        '"edge"', '"Inheritance"', '"Class"', '"Class"', 'true',
                        '"edge"', '"__name_edge"', '"__Name"', '"__name"', 'true',
                        '"edge"', '"__inh_1"', '"Association"', '"Class"', 'true',
                        '"edge"', '"__inh_2"', '"Attribute"', '"Class"', 'true',
                        '"value"', '"__attribute"', '"attribute"', 'true',
                        '"edge"', '"__attribute_edge"', '"Attribute"', '"__attribute"', 'false',
                    1,
                    '"retype_model"',
                        1,
                        1,
                        1, '"Inheritance"',
                        'true',
                            '"Class"', '"Class"', 'true',
                            '"Type"', '"Type"', 'true',
                            '"__String"', '"Type"', 'true',
                            '"Attribute"', '"Attribute"', 'true',
                            '"__Name"', '"Attribute"', 'true',
                            '"Association"', '"Association"', 'true',
                            '"Inheritance"', '"Association"', 'true',
                            '"__inh_1"', '"Inheritance"', 'true',
                            '"__inh_2"', '"Inheritance"', 'true',
                            '"__name"', '"__String"', 'true',
                            '"__name_edge"', '"__Name"', 'true',
                            '"__attribute"', '"__String"', 'true',
                            '"__attribute_edge"', '"__Name"', 'false',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"conformance_scd"',
                        '1',
                            '"const"', 1,
                        'false',
                        'true',
                    '"return"', 'true',
                        '"const"', 'true',
                ]
        self.assertTrue(run_barebone(flatten(commands), ['OK'], 1))

    def test_constructors_conformance_metamodel(self):
        commands = ['"instantiate_bottom"',
                        '"node"', '"Class"', 'true',
                        '"value"', '"Type"', '{"value": "Type"}', 'true',
                        '"value"', '"__String"', '{"value": "String"}', 'true',
                        '"value"', '"__name"', '"name"', 'true',
                        '"edge"', '"Attribute"', '"Class"', '"Type"', 'true',
                        '"edge"', '"__Name"', '"Attribute"', '"__String"', 'true',
                        '"edge"', '"Association"', '"Class"', '"Class"', 'true',
                        '"edge"', '"Inheritance"', '"Class"', '"Class"', 'true',
                        '"edge"', '"__name_edge"', '"__Name"', '"__name"', 'true',
                        '"edge"', '"__inh_1"', '"Association"', '"Class"', 'true',
                        '"edge"', '"__inh_2"', '"Attribute"', '"Class"', 'true',
                        '"value"', '"__attribute"', '"attribute"', 'true',
                        '"edge"', '"__attribute_edge"', '"Attribute"', '"__attribute"', 'false',
                    1,
                    '"retype_model"',
                        1,
                        1,
                        1, '"Inheritance"',
                        'true',
                            '"Class"', '"Class"', 'true',
                            '"Type"', '"Type"', 'true',
                            '"__String"', '"Type"', 'true',
                            '"Attribute"', '"Attribute"', 'true',
                            '"__Name"', '"Attribute"', 'true',
                            '"Association"', '"Association"', 'true',
                            '"Inheritance"', '"Association"', 'true',
                            '"__inh_1"', '"Inheritance"', 'true',
                            '"__inh2"', '"Inheritance"', 'true',
                            '"__name"', '"__String"', 'true',
                            '"__name_edge"', '"__Name"', 'true',
                            '"__attribute"', '"__String"', 'true',
                            '"__attribute_edge"', '"__Name"', 'false',
                    '"instantiate_model"',
                        1,
                        1, '"Inheritance"',
                        '"Class"', '"Place"',
                            'true',
                                '"tokens"', '{"value": "Integer"}', 'false',
                            'false',
                            'true',
                        '"Class"', '"Transition"',
                            'false',
                            'false',
                            'true',
                        '"Association"', '"P2T"', '"Place"', '"Transition"',
                            'true',
                                '"weight"', '{"value": "Integer"}', 'false',
                            'false',
                            'true',
                        '"Association"', '"T2P"', '"Transition"', '"Place"',
                            'true',
                                '"weight"', '{"value": "Integer"}', 'false',
                            'false',
                            'false',
                    2,
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"conformance_scd"',
                        '1',
                            '"const"', 2,
                        'false',
                        'true',
                    '"return"', 'true',
                        '"const"', 'true',
                ]
        self.assertTrue(run_barebone(flatten(commands), ['OK'], 1))

    def test_constructors_conformance_model(self):
        commands = ['"instantiate_bottom"',
                        '"node"', '"Class"', 'true',
                        '"value"', '"Type"', '{"value": "Type"}', 'true',
                        '"value"', '"__String"', '{"value": "String"}', 'true',
                        '"value"', '"__name"', '"name"', 'true',
                        '"edge"', '"Attribute"', '"Class"', '"Type"', 'true',
                        '"edge"', '"__Name"', '"Attribute"', '"__String"', 'true',
                        '"edge"', '"Association"', '"Class"', '"Class"', 'true',
                        '"edge"', '"Inheritance"', '"Class"', '"Class"', 'true',
                        '"edge"', '"__name_edge"', '"__Name"', '"__name"', 'true',
                        '"edge"', '"__inh_1"', '"Association"', '"Class"', 'true',
                        '"edge"', '"__inh_2"', '"Attribute"', '"Class"', 'true',
                        '"value"', '"__attribute"', '"attribute"', 'true',
                        '"edge"', '"__attribute_edge"', '"Attribute"', '"__attribute"', 'false',
                    1,
                    '"retype_model"',
                        1,
                        1,
                        1, '"Inheritance"',
                        'true',
                            '"Class"', '"Class"', 'true',
                            '"Type"', '"Type"', 'true',
                            '"__String"', '"Type"', 'true',
                            '"Attribute"', '"Attribute"', 'true',
                            '"__Name"', '"Attribute"', 'true',
                            '"Association"', '"Association"', 'true',
                            '"Inheritance"', '"Association"', 'true',
                            '"__inh_1"', '"Inheritance"', 'true',
                            '"__inh2"', '"Inheritance"', 'true',
                            '"__name"', '"__String"', 'true',
                            '"__name_edge"', '"__Name"', 'true',
                            '"__attribute"', '"__String"', 'true',
                            '"__attribute_edge"', '"__Name"', 'false',
                    '"instantiate_model"',
                        1,
                        1, '"Inheritance"',
                        '"Class"', '"Place"',
                            'true',
                                '"tokens"', '{"value": "Integer"}', 'false',
                            'false',
                            'true',
                        '"Class"', '"Transition"',
                            'false',
                            'false',
                            'true',
                        '"Association"', '"P2T"', '"Place"', '"Transition"',
                            'true',
                                '"weight"', '{"value": "Integer"}', 'false',
                            'false',
                            'true',
                        '"Association"', '"T2P"', '"Transition"', '"Place"',
                            'true',
                                '"weight"', '{"value": "Integer"}', 'false',
                            'false',
                            'false',
                    2,
                    '"instantiate_model"',
                        2,
                        1, '"Inheritance"',
                        '"Place"', '"p1"',
                            'false',
                            'true',
                                '"tokens"', '5', 'false',
                            'true',
                        '"Transition"', '"t1"',
                            'false',
                            'false',
                            'true',
                        '"P2T"', '""', '"p1"', '"t1"',
                            'false',
                            'true',
                                '"weight"', '1', 'false',
                            'true',
                        '"T2P"', '""', '"t1"', '"p1"',
                            'false',
                            'true',
                                '"weight"', '2', 'false',
                            'false',
                    3,
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"conformance_scd"',
                        '1',
                            '"const"', 3,
                        'false',
                        'true',
                    '"return"', 'true',
                        '"const"', 'true',
                ]
        self.assertTrue(run_barebone(flatten(commands), ['OK'], 1))

    def test_constructors_is_direct_instance(self):
        commands = ['"instantiate_bottom"',
                        '"node"', '"Class"', 'true',
                        '"value"', '"Type"', '{"value": "Type"}', 'true',
                        '"value"', '"__String"', '{"value": "String"}', 'true',
                        '"value"', '"__name"', '"name"', 'true',
                        '"edge"', '"Attribute"', '"Class"', '"Type"', 'true',
                        '"edge"', '"__Name"', '"Attribute"', '"__String"', 'true',
                        '"edge"', '"Association"', '"Class"', '"Class"', 'true',
                        '"edge"', '"Inheritance"', '"Class"', '"Class"', 'true',
                        '"edge"', '"__name_edge"', '"__Name"', '"__name"', 'true',
                        '"edge"', '"__inh_1"', '"Association"', '"Class"', 'true',
                        '"edge"', '"__inh_2"', '"Attribute"', '"Class"', 'true',
                        '"value"', '"__attribute"', '"attribute"', 'true',
                        '"edge"', '"__attribute_edge"', '"Attribute"', '"__attribute"', 'false',
                    1,
                    '"retype_model"',
                        1,
                        1,
                        1, '"Inheritance"',
                        'true',
                            '"Class"', '"Class"', 'true',
                            '"Type"', '"Type"', 'true',
                            '"__String"', '"Type"', 'true',
                            '"Attribute"', '"Attribute"', 'true',
                            '"__Name"', '"Attribute"', 'true',
                            '"Association"', '"Association"', 'true',
                            '"Inheritance"', '"Association"', 'true',
                            '"__inh_1"', '"Inheritance"', 'true',
                            '"__inh2"', '"Inheritance"', 'true',
                            '"__name"', '"__String"', 'true',
                            '"__name_edge"', '"__Name"', 'true',
                            '"__attribute"', '"__String"', 'true',
                            '"__attribute_edge"', '"__Name"', 'false',
                    '"instantiate_model"',
                        1,
                        1, '"Inheritance"',
                        '"Class"', '"A"',
                            'true',
                                '"a"', '{"value": "Integer"}', 'false',
                            'false',
                            'true',
                        '"Class"', '"B"',
                            'true',
                                '"b"', '{"value": "Integer"}', 'false',
                            'false',
                            'true',
                        '"Class"', '"C"',
                            'true',
                                '"b"', '{"value": "Integer"}', 'true',
                                '"c"', '{"value": "Integer"}', 'false',
                            'false',
                            'true',
                        '"Inheritance"', '"__inh_1"', '"A"', '"B"',
                            'false',
                            'false',
                            'false',
                    2,
                    '"instantiate_model"',
                        2,
                        1, '"Inheritance"',
                        '"A"', '"a"',
                            'false',
                            'true',
                                '"a"', '1', 'true',
                                '"b"', '1', 'false',
                            'true',
                        '"B"', '"b"',
                            'false',
                            'true',
                                '"b"', '1', 'false',
                            'true',
                        '"C"', '"c"',
                            'false',
                            'true',
                                '"b"', '1', 'true',
                                '"c"', '1', 'false',
                            'false',
                    3,
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"is_direct_instance"',
                        '3',
                            '"const"', 3,
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 3,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"a"',
                                'false',
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 2,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"A"',
                                'false',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"is_direct_instance"',
                        '3',
                            '"const"', 3,
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 3,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"a"',
                                'false',
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 2,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"B"',
                                'false',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"is_direct_instance"',
                        '3',
                            '"const"', 3,
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 3,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"a"',
                                'false',
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 2,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"C"',
                                'false',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"is_direct_instance"',
                        '3',
                            '"const"', 3,
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 3,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"b"',
                                'false',
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 2,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"A"',
                                'false',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"is_direct_instance"',
                        '3',
                            '"const"', 3,
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 3,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"b"',
                                'false',
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 2,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"B"',
                                'false',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"is_direct_instance"',
                        '3',
                            '"const"', 3,
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 3,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"b"',
                                'false',
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 2,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"C"',
                                'false',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"is_direct_instance"',
                        '3',
                            '"const"', 3,
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 3,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"c"',
                                'false',
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 2,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"A"',
                                'false',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"is_direct_instance"',
                        '3',
                            '"const"', 3,
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 3,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"c"',
                                'false',
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 2,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"B"',
                                'false',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"is_direct_instance"',
                        '3',
                            '"const"', 3,
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 3,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"c"',
                                'false',
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 2,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"C"',
                                'false',
                        'false',
                        'true',
                    '"return"', 'true',
                        '"const"', 'true',
                ]
        # Test in order:
        # a : A --> Yes
        # a : B --> No
        # a : C --> No
        # b : A --> No
        # b : B --> Yes
        # b : C --> No
        # c : A --> No
        # c : B --> No
        # c : C --> Yes
        self.assertTrue(run_barebone(flatten(commands), ['True', 'False', 'False', 'False', 'True', 'False', 'False', 'False', 'True'], 1))

    def test_constructors_is_nominal_instance(self):
        commands = ['"instantiate_bottom"',
                        '"node"', '"Class"', 'true',
                        '"value"', '"Type"', '{"value": "Type"}', 'true',
                        '"value"', '"__String"', '{"value": "String"}', 'true',
                        '"value"', '"__name"', '"name"', 'true',
                        '"edge"', '"Attribute"', '"Class"', '"Type"', 'true',
                        '"edge"', '"__Name"', '"Attribute"', '"__String"', 'true',
                        '"edge"', '"Association"', '"Class"', '"Class"', 'true',
                        '"edge"', '"Inheritance"', '"Class"', '"Class"', 'true',
                        '"edge"', '"__name_edge"', '"__Name"', '"__name"', 'true',
                        '"edge"', '"__inh_1"', '"Association"', '"Class"', 'true',
                        '"edge"', '"__inh_2"', '"Attribute"', '"Class"', 'true',
                        '"value"', '"__attribute"', '"attribute"', 'true',
                        '"edge"', '"__attribute_edge"', '"Attribute"', '"__attribute"', 'false',
                    1,
                    '"retype_model"',
                        1,
                        1,
                        1, '"Inheritance"',
                        'true',
                            '"Class"', '"Class"', 'true',
                            '"Type"', '"Type"', 'true',
                            '"__String"', '"Type"', 'true',
                            '"Attribute"', '"Attribute"', 'true',
                            '"__Name"', '"Attribute"', 'true',
                            '"Association"', '"Association"', 'true',
                            '"Inheritance"', '"Association"', 'true',
                            '"__inh_1"', '"Inheritance"', 'true',
                            '"__inh2"', '"Inheritance"', 'true',
                            '"__name"', '"__String"', 'true',
                            '"__name_edge"', '"__Name"', 'true',
                            '"__attribute"', '"__String"', 'true',
                            '"__attribute_edge"', '"__Name"', 'false',
                    '"instantiate_model"',
                        1,
                        1, '"Inheritance"',
                        '"Class"', '"A"',
                            'true',
                                '"a"', '{"value": "Integer"}', 'false',
                            'false',
                            'true',
                        '"Class"', '"B"',
                            'true',
                                '"b"', '{"value": "Integer"}', 'false',
                            'false',
                            'true',
                        '"Class"', '"C"',
                            'true',
                                '"b"', '{"value": "Integer"}', 'true',
                                '"c"', '{"value": "Integer"}', 'false',
                            'false',
                            'true',
                        '"Inheritance"', '"__inh_1"', '"A"', '"B"',
                            'false',
                            'false',
                            'false',
                    2,
                    '"instantiate_model"',
                        2,
                        1, '"Inheritance"',
                        '"A"', '"a"',
                            'false',
                            'true',
                                '"a"', '1', 'true',
                                '"b"', '1', 'false',
                            'true',
                        '"B"', '"b"',
                            'false',
                            'true',
                                '"b"', '1', 'false',
                            'true',
                        '"C"', '"c"',
                            'false',
                            'true',
                                '"b"', '1', 'true',
                                '"c"', '1', 'false',
                            'false',
                    3,
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"is_nominal_instance"',
                        '3',
                            '"const"', 3,
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 3,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"a"',
                                'false',
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 2,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"A"',
                                'false',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"is_nominal_instance"',
                        '3',
                            '"const"', 3,
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 3,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"a"',
                                'false',
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 2,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"B"',
                                'false',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"is_nominal_instance"',
                        '3',
                            '"const"', 3,
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 3,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"a"',
                                'false',
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 2,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"C"',
                                'false',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"is_nominal_instance"',
                        '3',
                            '"const"', 3,
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 3,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"b"',
                                'false',
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 2,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"A"',
                                'false',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"is_nominal_instance"',
                        '3',
                            '"const"', 3,
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 3,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"b"',
                                'false',
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 2,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"B"',
                                'false',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"is_nominal_instance"',
                        '3',
                            '"const"', 3,
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 3,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"b"',
                                'false',
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 2,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"C"',
                                'false',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"is_nominal_instance"',
                        '3',
                            '"const"', 3,
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 3,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"c"',
                                'false',
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 2,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"A"',
                                'false',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"is_nominal_instance"',
                        '3',
                            '"const"', 3,
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 3,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"c"',
                                'false',
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 2,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"B"',
                                'false',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"is_nominal_instance"',
                        '3',
                            '"const"', 3,
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 3,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"c"',
                                'false',
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 2,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"C"',
                                'false',
                        'false',
                        'true',
                    '"return"', 'true',
                        '"const"', 'true',
                ]
        # Test in order:
        # a : A --> Yes
        # a : B --> Yes
        # a : C --> No
        # b : A --> No
        # b : B --> Yes
        # b : C --> No
        # c : A --> No
        # c : B --> No
        # c : C --> Yes
        self.assertTrue(run_barebone(flatten(commands), ['True', 'True', 'False', 'False', 'True', 'False', 'False', 'False', 'True'], 1))

    def test_constructors_is_structural_instance(self):
        commands = ['"instantiate_bottom"',
                        '"node"', '"Class"', 'true',
                        '"value"', '"Type"', '{"value": "Type"}', 'true',
                        '"value"', '"__String"', '{"value": "String"}', 'true',
                        '"value"', '"__name"', '"name"', 'true',
                        '"edge"', '"Attribute"', '"Class"', '"Type"', 'true',
                        '"edge"', '"__Name"', '"Attribute"', '"__String"', 'true',
                        '"edge"', '"Association"', '"Class"', '"Class"', 'true',
                        '"edge"', '"Inheritance"', '"Class"', '"Class"', 'true',
                        '"edge"', '"__name_edge"', '"__Name"', '"__name"', 'true',
                        '"edge"', '"__inh_1"', '"Association"', '"Class"', 'true',
                        '"edge"', '"__inh_2"', '"Attribute"', '"Class"', 'true',
                        '"value"', '"__attribute"', '"attribute"', 'true',
                        '"edge"', '"__attribute_edge"', '"Attribute"', '"__attribute"', 'false',
                    1,
                    '"retype_model"',
                        1,
                        1,
                        1, '"Inheritance"',
                        'true',
                            '"Class"', '"Class"', 'true',
                            '"Type"', '"Type"', 'true',
                            '"__String"', '"Type"', 'true',
                            '"Attribute"', '"Attribute"', 'true',
                            '"__Name"', '"Attribute"', 'true',
                            '"Association"', '"Association"', 'true',
                            '"Inheritance"', '"Association"', 'true',
                            '"__inh_1"', '"Inheritance"', 'true',
                            '"__inh2"', '"Inheritance"', 'true',
                            '"__name"', '"__String"', 'true',
                            '"__name_edge"', '"__Name"', 'true',
                            '"__attribute"', '"__String"', 'true',
                            '"__attribute_edge"', '"__Name"', 'false',
                    '"instantiate_model"',
                        1,
                        1, '"Inheritance"',
                        '"Class"', '"A"',
                            'true',
                                '"a"', '{"value": "Integer"}', 'false',
                            'false',
                            'true',
                        '"Class"', '"B"',
                            'true',
                                '"b"', '{"value": "Integer"}', 'false',
                            'false',
                            'true',
                        '"Class"', '"C"',
                            'true',
                                '"b"', '{"value": "Integer"}', 'true',
                                '"c"', '{"value": "Integer"}', 'false',
                            'false',
                            'true',
                        '"Inheritance"', '"__inh_1"', '"A"', '"B"',
                            'false',
                            'false',
                            'false',
                    2,
                    '"instantiate_model"',
                        2,
                        1, '"Inheritance"',
                        '"A"', '"a"',
                            'false',
                            'true',
                                '"a"', '1', 'false',
                            'true',
                        '"B"', '"b"',
                            'false',
                            'true',
                                '"b"', '1', 'false',
                            'true',
                        '"C"', '"c"',
                            'false',
                            'true',
                                '"b"', '1', 'true',
                                '"c"', '1', 'false',
                            'false',
                    3,
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"is_structural_instance"',
                        '3',
                            '"const"', 3,
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 3,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"a"',
                                'false',
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 2,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"A"',
                                'false',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"is_structural_instance"',
                        '3',
                            '"const"', 3,
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 3,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"a"',
                                'false',
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 2,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"B"',
                                'false',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"is_structural_instance"',
                        '3',
                            '"const"', 3,
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 3,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"a"',
                                'false',
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 2,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"C"',
                                'false',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"is_structural_instance"',
                        '3',
                            '"const"', 3,
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 3,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"b"',
                                'false',
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 2,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"A"',
                                'false',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"is_structural_instance"',
                        '3',
                            '"const"', 3,
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 3,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"b"',
                                'false',
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 2,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"B"',
                                'false',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"is_structural_instance"',
                        '3',
                            '"const"', 3,
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 3,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"b"',
                                'false',
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 2,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"C"',
                                'false',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"is_structural_instance"',
                        '3',
                            '"const"', 3,
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 3,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"c"',
                                'false',
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 2,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"A"',
                                'false',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"is_structural_instance"',
                        '3',
                            '"const"', 3,
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 3,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"c"',
                                'false',
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 2,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"B"',
                                'false',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"is_structural_instance"',
                        '3',
                            '"const"', 3,
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 3,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"c"',
                                'false',
                            '"call"',
                        '"access"',
                                '"resolve"', '"dict_read"',
                                '2',
                                '"call"',
                        '"access"',
                                    '"resolve"', '"dict_read"',
                                    '2',
                                    '"const"', 2,
                                    '"const"', '"model"',
                                    'false',
                                '"const"', '"C"',
                                'false',
                        'false',
                        'true',
                    '"return"', 'true',
                        '"const"', 'true',
                ]
        # Test in order:
        # a : A --> Yes
        # a : B --> No
        # a : C --> No
        # b : A --> No
        # b : B --> Yes
        # b : C --> No
        # c : A --> No
        # c : B --> Yes
        # c : C --> Yes
        self.assertTrue(run_barebone(flatten(commands), ['True', 'False', 'False', 'False', 'True', 'False', 'False', 'True', 'True'], 1))

    def test_constructors_readAttribute(self):
        commands = ['"instantiate_bottom"',
                        '"node"', '"Class"', 'true',
                        '"value"', '"Type"', '{"value": "Type"}', 'true',
                        '"value"', '"__String"', '{"value": "String"}', 'true',
                        '"value"', '"__name"', '"name"', 'true',
                        '"edge"', '"Attribute"', '"Class"', '"Type"', 'true',
                        '"edge"', '"__Name"', '"Attribute"', '"__String"', 'true',
                        '"edge"', '"Association"', '"Class"', '"Class"', 'true',
                        '"edge"', '"Inheritance"', '"Class"', '"Class"', 'true',
                        '"edge"', '"__name_edge"', '"__Name"', '"__name"', 'true',
                        '"edge"', '"__inh_1"', '"Association"', '"Class"', 'true',
                        '"edge"', '"__inh_2"', '"Attribute"', '"Class"', 'true',
                        '"value"', '"__attribute"', '"attribute"', 'true',
                        '"edge"', '"__attribute_edge"', '"Attribute"', '"__attribute"', 'false',
                    1,
                    '"retype_model"',
                        1,
                        1,
                        1, '"Inheritance"',
                        'true',
                            '"Class"', '"Class"', 'true',
                            '"Type"', '"Type"', 'true',
                            '"__String"', '"Type"', 'true',
                            '"Attribute"', '"Attribute"', 'true',
                            '"__Name"', '"Attribute"', 'true',
                            '"Association"', '"Association"', 'true',
                            '"Inheritance"', '"Association"', 'true',
                            '"__inh_1"', '"Inheritance"', 'true',
                            '"__inh2"', '"Inheritance"', 'true',
                            '"__name"', '"__String"', 'true',
                            '"__name_edge"', '"__Name"', 'true',
                            '"__attribute"', '"__String"', 'true',
                            '"__attribute_edge"', '"__Name"', 'false',
                    '"instantiate_model"',
                        1,
                        1, '"Inheritance"',
                        '"Class"', '"Place"',
                            'true',
                                '"tokens"', '{"value": "Integer"}', 'false',
                            'false',
                            'true',
                        '"Class"', '"Transition"',
                            'false',
                            'false',
                            'true',
                        '"Association"', '"P2T"', '"Place"', '"Transition"',
                            'true',
                                '"weight"', '{"value": "Integer"}', 'false',
                            'false',
                            'true',
                        '"Association"', '"T2P"', '"Transition"', '"Place"',
                            'true',
                                '"weight"', '{"value": "Integer"}', 'false',
                            'false',
                            'false',
                    2,
                    '"instantiate_model"',
                        2,
                        1, '"Inheritance"',
                        '"Place"', '"p1"',
                            'false',
                            'true',
                                '"tokens"', '5', 'false',
                            'true',
                        '"Transition"', '"t1"',
                            'false',
                            'false',
                            'true',
                        '"P2T"', '"arc1"', '"p1"', '"t1"',
                            'false',
                            'true',
                                '"weight"', '1', 'false',
                            'true',
                        '"T2P"', '"arc2"', '"t1"', '"p1"',
                            'false',
                            'true',
                                '"weight"', '2', 'false',
                            'false',
                    3,
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"readAttribute"',
                        '3',
                            '"const"', 3,
                            '"call"', 
                        '"access"',
                                '"resolve"', '"readElementByName"',
                                '2',
                                    '"const"', 3,
                                    '"const"', '"p1"',
                                'false',
                            '"const"', '"tokens"',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"readAttribute"',
                        '3',
                            '"const"', 3,
                            '"call"', 
                        '"access"',
                                '"resolve"', '"readElementByName"',
                                '2',
                                    '"const"', 3,
                                    '"const"', '"arc1"',
                                'false',
                            '"const"', '"weight"',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"readAttribute"',
                        '3',
                            '"const"', 3,
                            '"call"', 
                        '"access"',
                                '"resolve"', '"readElementByName"',
                                '2',
                                    '"const"', 3,
                                    '"const"', '"arc2"',
                                'false',
                            '"const"', '"weight"',
                        'false',
                        'true',
                    '"return"', 'true',
                        '"const"', 'true',
                ]
        self.assertTrue(run_barebone(flatten(commands), ['5', '1', '2'], 1))

    def test_constructors_readAndSetAttribute(self):
        commands = ['"instantiate_bottom"',
                        '"node"', '"Class"', 'true',
                        '"value"', '"Type"', '{"value": "Type"}', 'true',
                        '"value"', '"__String"', '{"value": "String"}', 'true',
                        '"value"', '"__name"', '"name"', 'true',
                        '"edge"', '"Attribute"', '"Class"', '"Type"', 'true',
                        '"edge"', '"__Name"', '"Attribute"', '"__String"', 'true',
                        '"edge"', '"Association"', '"Class"', '"Class"', 'true',
                        '"edge"', '"Inheritance"', '"Class"', '"Class"', 'true',
                        '"edge"', '"__name_edge"', '"__Name"', '"__name"', 'true',
                        '"edge"', '"__inh_1"', '"Association"', '"Class"', 'true',
                        '"edge"', '"__inh_2"', '"Attribute"', '"Class"', 'true',
                        '"value"', '"__attribute"', '"attribute"', 'true',
                        '"edge"', '"__attribute_edge"', '"Attribute"', '"__attribute"', 'false',
                    1,
                    '"retype_model"',
                        1,
                        1,
                        1, '"Inheritance"',
                        'true',
                            '"Class"', '"Class"', 'true',
                            '"Type"', '"Type"', 'true',
                            '"__String"', '"Type"', 'true',
                            '"Attribute"', '"Attribute"', 'true',
                            '"__Name"', '"Attribute"', 'true',
                            '"Association"', '"Association"', 'true',
                            '"Inheritance"', '"Association"', 'true',
                            '"__inh_1"', '"Inheritance"', 'true',
                            '"__inh2"', '"Inheritance"', 'true',
                            '"__name"', '"__String"', 'true',
                            '"__name_edge"', '"__Name"', 'true',
                            '"__attribute"', '"__String"', 'true',
                            '"__attribute_edge"', '"__Name"', 'false',
                    '"instantiate_model"',
                        1,
                        1, '"Inheritance"',
                        '"Class"', '"Place"',
                            'true',
                                '"tokens"', '{"value": "Integer"}', 'false',
                            'false',
                            'true',
                        '"Class"', '"Transition"',
                            'false',
                            'false',
                            'true',
                        '"Association"', '"P2T"', '"Place"', '"Transition"',
                            'true',
                                '"weight"', '{"value": "Integer"}', 'false',
                            'false',
                            'true',
                        '"Association"', '"T2P"', '"Transition"', '"Place"',
                            'true',
                                '"weight"', '{"value": "Integer"}', 'false',
                            'false',
                            'false',
                    2,
                    '"instantiate_model"',
                        2,
                        1, '"Inheritance"',
                        '"Place"', '"p1"',
                            'false',
                            'true',
                                '"tokens"', '5', 'false',
                            'true',
                        '"Transition"', '"t1"',
                            'false',
                            'false',
                            'true',
                        '"P2T"', '"arc1"', '"p1"', '"t1"',
                            'false',
                            'true',
                                '"weight"', '1', 'false',
                            'true',
                        '"T2P"', '"arc2"', '"t1"', '"p1"',
                            'false',
                            'true',
                                '"weight"', '2', 'false',
                            'false',
                    3,
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"readAttribute"',
                        '3',
                            '"const"', 3,
                            '"call"', 
                        '"access"',
                                '"resolve"', '"readElementByName"',
                                '2',
                                    '"const"', 3,
                                    '"const"', '"p1"',
                                'false',
                            '"const"', '"tokens"',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"readAttribute"',
                        '3',
                            '"const"', 3,
                            '"call"', 
                        '"access"',
                                '"resolve"', '"readElementByName"',
                                '2',
                                    '"const"', 3,
                                    '"const"', '"arc1"',
                                'false',
                            '"const"', '"weight"',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"readAttribute"',
                        '3',
                            '"const"', 3,
                            '"call"', 
                        '"access"',
                                '"resolve"', '"readElementByName"',
                                '2',
                                    '"const"', 3,
                                    '"const"', '"arc2"',
                                'false',
                            '"const"', '"weight"',
                        'false',
                        'true',
                    '"call"', 
                        '"access"',
                        '"resolve"', '"setAttribute"',
                        '4',
                            '"const"', 3,
                            '"call"', 
                        '"access"',
                                '"resolve"', '"readElementByName"',
                                '2',
                                    '"const"', 3,
                                    '"const"', '"p1"',
                                'false',
                            '"const"', '"tokens"',
                            '"const"', '10',
                        'true',
                    '"call"', 
                        '"access"',
                        '"resolve"', '"setAttribute"',
                        '4',
                            '"const"', 3,
                            '"call"', 
                        '"access"',
                                '"resolve"', '"readElementByName"',
                                '2',
                                    '"const"', 3,
                                    '"const"', '"arc1"',
                                'false',
                            '"const"', '"weight"',
                            '"const"', '16',
                        'true',
                    '"call"', 
                        '"access"',
                        '"resolve"', '"setAttribute"',
                        '4',
                            '"const"', 3,
                            '"call"', 
                        '"access"',
                                '"resolve"', '"readElementByName"',
                                '2',
                                    '"const"', 3,
                                    '"const"', '"arc2"',
                                'false',
                            '"const"', '"weight"',
                            '"const"', '30',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"readAttribute"',
                        '3',
                            '"const"', 3,
                            '"call"', 
                        '"access"',
                                '"resolve"', '"readElementByName"',
                                '2',
                                    '"const"', 3,
                                    '"const"', '"p1"',
                                'false',
                            '"const"', '"tokens"',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"readAttribute"',
                        '3',
                            '"const"', 3,
                            '"call"', 
                        '"access"',
                                '"resolve"', '"readElementByName"',
                                '2',
                                    '"const"', 3,
                                    '"const"', '"arc1"',
                                'false',
                            '"const"', '"weight"',
                        'false',
                        'true',
                    '"output"', '"call"', 
                        '"access"',
                        '"resolve"', '"readAttribute"',
                        '3',
                            '"const"', 3,
                            '"call"', 
                        '"access"',
                                '"resolve"', '"readElementByName"',
                                '2',
                                    '"const"', 3,
                                    '"const"', '"arc2"',
                                'false',
                            '"const"', '"weight"',
                        'false',
                        'true',
                    '"return"', 'true',
                        '"const"', 'true',
                ]
        self.assertTrue(run_barebone(flatten(commands), ['5', '1', '2', '10', '16', '30'], 1))
