RoomModel DynamicConfigTest {

	import etrice.api.types.char
	import etrice.api.types.boolean
	import etrice.api.types.int8
	import etrice.api.types.int16
	import etrice.api.types.int32
	import etrice.api.types.int64
	import etrice.api.types.float32
	import etrice.api.types.float64
	import etrice.api.types.string
	import etrice.api.timer.PTimer
	import etrice.api.timer.ATimerService

	LogicalSystem System_DynamicConfigTest {
		SubSystemRef main: SubSystem_DynamicConfigTest
	}

	SubSystemClass SubSystem_DynamicConfigTest {
		ActorRef testee: Testee_ac
		ActorRef timingService: ATimerService
		LayerConnection ref testee satisfied_by timingService.timer
	
		LogicalThread defaultThread
	}

	ActorClass Testee_ac {
		Structure {
			usercode1 '''
				import java.util.HashMap;
				import java.util.Map;
				import org.eclipse.etrice.runtime.java.config.IConfigSource;'''
			SAP timer: PTimer
			Attribute caseId: int32
			Attribute testId: int32 = "1"

			// no dynConfig
			Attribute sString: string

			// dynConfig
			Attribute aInt8: int8
			Attribute aInt16: int16
			Attribute aInt32: int32
			Attribute aInt64: int64
			Attribute aBool: boolean
			Attribute aFloat32: float32
			Attribute aFloat64: float64
			Attribute aChar: char
			Attribute aString: string
			Attribute aInt8_array [2]: int8
			Attribute aInt16_array [2]: int16
			Attribute aInt32_array [2]: int32
			Attribute aInt64_array [2]: int64
			Attribute aBool_array [2]: boolean
			Attribute aFloat32_array [2]: float32
			Attribute aFloat64_array [2]: float64
			Attribute aChar_array [2]: char
			Attribute dc: Data_dc
		}
		Behavior {
			ctor '''
				etUnit_open("log", "DynamicConfigTest");
				etUnit_openTestSuite("org.eclipse.etrice.generator.java.tests.DynamicConfigTest");
				caseId = etUnit_openTestCase("DynamicConfigTest_case_Testee_ac");'''
			dtor '''
				etUnit_closeTestCase(caseId);
				etUnit_closeTestSuite();
				etUnit_close();'''
			StateMachine {
				Transition t0: initial -> ChangeConfigValid {
				}
				Transition t1: ChangeConfigValid -> Test {
					triggers {
						<timeout: timer>
					}
					action '''testId++;'''
				}
				Transition t2: Test -> ChangeConfigInvalid {
					triggers {
						<timeout: timer guard '''testId==2'''>
					}
				}
				Transition t3: ChangeConfigInvalid -> Test {
					triggers {
						<timeout: timer>
					}
					action '''testId++;'''
				}
				Transition t4: Test -> Done {
					triggers {
						<timeout: timer guard '''testId==4'''>
					}
				}
				Transition tr0: Test -> ChangeConfigValid {
					triggers {
						<timeout: timer guard '''testId==3'''>
					}
				}
				State ChangeConfigValid {
					entry '''
						IConfigSource source = ConfigSourceTestInstance.getInstance();
						String path = this.getInstancePath();
						Map<String, Object> testValues = new HashMap<String, Object>();
						testValues.put(path+"/aInt8", 50);
						testValues.put(path+"/aInt16", 51);
						testValues.put(path+"/aInt32", 52);
						testValues.put(path+"/aInt64", 53);
						testValues.put(path+"/aFloat32", 5.4f);
						testValues.put(path+"/aFloat64", 5.5);
						testValues.put(path+"/aChar", 'B');
						testValues.put(path+"/aString", "Do-NOT-UPDATE-me");
						testValues.put(path+"/aBool", true);
						testValues.put(path+"/dc/nested/aInt32", 56);
						testValues.put(path+"/dc/aString", "Okay");
						testValues.put(path+"/aInt8_array", new Byte[]{50,40});
						testValues.put(path+"/aInt16_array", new Short[]{51,41});
						testValues.put(path+"/aInt32_array", new Integer[]{52,42});
						testValues.put(path+"/aInt64_array", new Long[]{53L,43L});
						testValues.put(path+"/aFloat32_array", new Float[]{5.4f, 4.4f});
						testValues.put(path+"/aFloat64_array", new Double[]{5.5, 4.5});
						testValues.put(path+"/aChar_array", "BB");
						testValues.put(path+"/aBool_array", new Boolean[]{true, false});
						source.writeValues(testValues);
						timer.startTimer(400);'''
				}
				State ChangeConfigInvalid {
					entry '''
						getAStringLock().forbidUpdate();
						IConfigSource source = ConfigSourceTestInstance.getInstance();
						String path = this.getInstancePath();
						Map<String, Object> testValues = new HashMap<String, Object>();
						testValues.put(path+"/aInt8", 128);
						testValues.put(path+"/aInt16", 61);
						testValues.put(path+"/aInt32", -2);
						testValues.put(path+"/aInt64", Long.MAX_VALUE);
						testValues.put(path+"/aFloat32", -100f);
						testValues.put(path+"/aFloat64", 100d);
						testValues.put(path+"/aChar", "string");
						testValues.put(path+"/aString", "VALID-String");
						testValues.put(path+"/aBool", "true");
						testValues.put(path+"/dc/aString", 0.89898);
						testValues.put(path+"/dc/nested/aInt32", 62);
						testValues.put(path+"/aInt8_array", 128);
						testValues.put(path+"/aInt16_array", new Short[]{-1,-2});
						testValues.put(path+"/aInt32_array", new Integer[]{60,59});
						testValues.put(path+"/aInt64_array", new Long[]{60000L,60000L});
						testValues.put(path+"/aFloat32_array", new Float[]{0f, -2f});
						testValues.put(path+"/aFloat64_array", "string");
						testValues.put(path+"/aChar_array", "BBB");
						testValues.put(path+"/aBool_array", 500);
						source.writeValues(testValues);
						timer.startTimer(400);'''
				}
				State Test {
					entry '''
						EXPECT_EQUAL_INT8(caseId, "1:Testee_ac", (byte)50, getAInt8());
						EXPECT_EQUAL_INT16(caseId, "2:Testee_ac", (short)51, getAInt16());
						EXPECT_EQUAL_INT32(caseId, "3:Testee_ac", 52, getAInt32());
						EXPECT_TRUE(caseId, "4:Testee_ac", getAInt64() == 53L);
						EXPECT_EQUAL_FLOAT32(caseId, "5:Testee_ac", 5.4f, getAFloat32(), 0.1f);
						EXPECT_TRUE(caseId, "6:Testee_ac", getAFloat64() == 5.5);
						EXPECT_TRUE(caseId, "7:Testee_ac", getAChar() == 'B');
						EXPECT_TRUE(caseId, "8:Testee_ac", "Do-NOT-UPDATE-me".equals(getAString()));
						EXPECT_TRUE(caseId, "9:Testee_ac", getABool() == true);
						EXPECT_TRUE(caseId, "10:Testee_ac", getAInt8_array()[0] == 50 && getAInt8_array()[1] == 40);
						EXPECT_TRUE(caseId, "11:Testee_ac", getAInt16_array()[0] == 51 && getAInt16_array()[1] == 41);
						EXPECT_TRUE(caseId, "12:Testee_ac", getAInt32_array()[0] == 52 && getAInt32_array()[1] == 42);
						EXPECT_TRUE(caseId, "13:Testee_ac", getAInt64_array()[0] == 53L && getAInt64_array()[1] == 43L);
						EXPECT_EQUAL_FLOAT32(caseId, "14.1:Testee_ac", 5.4f, getAFloat32_array()[0], 0.1f);
						EXPECT_EQUAL_FLOAT32(caseId, "14.2:Testee_ac", 4.4f, getAFloat32_array()[1], 0.1f);
						EXPECT_TRUE(caseId, "15:Testee_ac", getAFloat64_array()[0] == 5.5 && getAFloat64_array()[1] == 4.5);
						EXPECT_TRUE(caseId, "16:Testee_ac", String.valueOf(getAChar_array()).equals("BB"));
						EXPECT_TRUE(caseId, "18:Testee_ac", getABool_array()[0] == true && getABool_array()[1] == false);
						EXPECT_TRUE(caseId, "19:Testee_ac", "Okay".equals(getDc().getAString()));
						EXPECT_TRUE(caseId, "20:Testee_ac", getDc().getNested().getAInt32() == 56);
						timer.startTimer(1);'''
				}
				State Done {
					entry '''	etUnit_testFinished(caseId);'''
				}
			}
		}
	}

	DataClass Data_dc {
		Attribute aString: string
		Attribute nested: Data_nested_dc
	}

	DataClass Data_nested_dc {
		Attribute aInt32: int32
	}
}