From 4d6ce6c94939e532e9f708091d17abd05c3f9ead Mon Sep 17 00:00:00 2001 From: Philip Makedonski <makedonski@informatik.uni-goettingen.de> Date: Fri, 22 Dec 2023 14:11:37 +0100 Subject: [PATCH] + TR examples --- tr-examples/configuration.tplan2.tdltx | 15 +++ tr-examples/data.tplan2.tdltx | 16 ++++ tr-examples/data_tables.tdlan2.tdltx | 20 ++++ tr-examples/descriptions.tdlan2.tdltx | 33 +++++++ tr-examples/domain.tplan2.tdltx | 12 +++ .../inferred_configuration.tdlan2.tdltx | 12 +++ tr-examples/inferred_data.tdlan2.tdltx | 23 +++++ tr-examples/objectives.tplan2.tdltx | 87 ++++++++++++++++++ tr-examples/objectives.tplan2.tdltx.tdltx | 64 +++++++++++++ .../objectives.tplan2.tdltx.tdltx.docx | Bin 0 -> 11707 bytes 10 files changed, 282 insertions(+) create mode 100644 tr-examples/configuration.tplan2.tdltx create mode 100644 tr-examples/data.tplan2.tdltx create mode 100644 tr-examples/data_tables.tdlan2.tdltx create mode 100644 tr-examples/descriptions.tdlan2.tdltx create mode 100644 tr-examples/domain.tplan2.tdltx create mode 100644 tr-examples/inferred_configuration.tdlan2.tdltx create mode 100644 tr-examples/inferred_data.tdlan2.tdltx create mode 100644 tr-examples/objectives.tplan2.tdltx create mode 100644 tr-examples/objectives.tplan2.tdltx.tdltx create mode 100644 tr-examples/objectives.tplan2.tdltx.tdltx.docx diff --git a/tr-examples/configuration.tplan2.tdltx b/tr-examples/configuration.tplan2.tdltx new file mode 100644 index 0000000..86fa3c1 --- /dev/null +++ b/tr-examples/configuration.tplan2.tdltx @@ -0,0 +1,15 @@ +Package base_configuration { + Import all from data + Annotation Final conditions + Annotation Expected behaviour + Annotation Initial conditions + Message Gate wireless accepts position + Component unit { + gate wireless wifi + } + Configuration basic { + unit controller as Tester, + unit object as SUT, + connect controller::wifi to object::wifi + } +} \ No newline at end of file diff --git a/tr-examples/data.tplan2.tdltx b/tr-examples/data.tplan2.tdltx new file mode 100644 index 0000000..00739be --- /dev/null +++ b/tr-examples/data.tplan2.tdltx @@ -0,0 +1,16 @@ +Package data { + Annotation Final conditions + Annotation Expected behaviour + Annotation Initial conditions + Type float + Structure position ( + float x, + float y + ) + float _22 + float _21 + position startingPosition ( + Note : "indicating value" + x = instance _21 + ) +} \ No newline at end of file diff --git a/tr-examples/data_tables.tdlan2.tdltx b/tr-examples/data_tables.tdlan2.tdltx new file mode 100644 index 0000000..c3a73a0 --- /dev/null +++ b/tr-examples/data_tables.tdlan2.tdltx @@ -0,0 +1,20 @@ +Package data_tables { + Import all from inferred_data + Import all from inferred_configuration + inferred_position start_position ( ) + inferred_position open_position ( ) + inferred_position closed_position ( ) + inferred_position end_position ( ) + Action move_to ( inferred_position position ) + Test Description TC_MOVE_TO ( + inferred_position target_position ) uses inferred_move_object { + Controller::inferred_gate sends parameter target_position to Object::inferred_gate + perform move_to ( position = parameter target_position ) on Object + } + Test Description TC_MOVE_AROUND uses inferred_move_object { + execute TC_MOVE_TO ( target_position = instance start_position ) + execute TC_MOVE_TO ( target_position = instance open_position ) + execute TC_MOVE_TO ( target_position = instance closed_position ) + execute TC_MOVE_TO ( target_position = instance end_position ) + } +} \ No newline at end of file diff --git a/tr-examples/descriptions.tdlan2.tdltx b/tr-examples/descriptions.tdlan2.tdltx new file mode 100644 index 0000000..b8b8877 --- /dev/null +++ b/tr-examples/descriptions.tdlan2.tdltx @@ -0,0 +1,33 @@ +/* +Copyright (c) ETSI 2020. + +This software is subject to copyrights owned by ETSI. Non-exclusive permission +is hereby granted, free of charge, to copy, reproduce and amend this file +under the following conditions: It is provided "as is", without warranty of any +kind, expressed or implied. + +ETSI shall never be liable for any claim, damages, or other liability arising +from its use or inability of use.This permission does not apply to any documentation +associated with this file for which ETSI keeps all rights reserved. The present +copyright notice shall be included in all copies of whole or part of this +file and shall not imply any sub-license right. +*/ + +//Inferred (manually) from objectives.tplan2 +Package descriptions { + Import all from inferred_configuration + Import all from inferred_data + + Action move_to ( inferred_position position) + + Test Description TD_MOVE_OBJECT_LITERAL uses inferred_move_object { + Controller::inferred_gate sends inferred_start_position to Object::inferred_gate + perform move_to ( position = inferred_start_position ) on Object + } + + Test Description TD_MOVE_OBJECT_LITERAL_INLINE uses inferred_move_object { + Controller::inferred_gate sends new inferred_position (x = 22, y = 21) to Object::inferred_gate + perform move_to ( position = new inferred_position (x = 22, y = 21) ) on Object + } + +} \ No newline at end of file diff --git a/tr-examples/domain.tplan2.tdltx b/tr-examples/domain.tplan2.tdltx new file mode 100644 index 0000000..942a81c --- /dev/null +++ b/tr-examples/domain.tplan2.tdltx @@ -0,0 +1,12 @@ +Package domain { + Annotation Final conditions + Annotation Expected behaviour + Annotation Initial conditions + PICS MOVABLE + Entity Object + Entity Controller + Event sends + Event receives + Event moves + Event moves_to +} \ No newline at end of file diff --git a/tr-examples/inferred_configuration.tdlan2.tdltx b/tr-examples/inferred_configuration.tdlan2.tdltx new file mode 100644 index 0000000..13943ea --- /dev/null +++ b/tr-examples/inferred_configuration.tdlan2.tdltx @@ -0,0 +1,12 @@ +Package inferred_configuration { + Import all from data + Message Gate inferred_gate_type accepts position + Component inferred_component_type { + gate inferred_gate_type inferred_gate + } + Configuration inferred_move_object { + inferred_component_type Controller as Tester, + inferred_component_type Object as SUT, + connect Controller::inferred_gate to Object::inferred_gate + } +} \ No newline at end of file diff --git a/tr-examples/inferred_data.tdlan2.tdltx b/tr-examples/inferred_data.tdlan2.tdltx new file mode 100644 index 0000000..573c27f --- /dev/null +++ b/tr-examples/inferred_data.tdlan2.tdltx @@ -0,0 +1,23 @@ +/* +Copyright (c) ETSI 2020. + +This software is subject to copyrights owned by ETSI. Non-exclusive permission +is hereby granted, free of charge, to copy, reproduce and amend this file +under the following conditions: It is provided "as is", without warranty of any +kind, expressed or implied. + +ETSI shall never be liable for any claim, damages, or other liability arising +from its use or inability of use.This permission does not apply to any documentation +associated with this file for which ETSI keeps all rights reserved. The present +copyright notice shall be included in all copies of whole or part of this +file and shall not imply any sub-license right. +*/ + +//Inferred (manually) from objectives.tplan2 +Package inferred_data { + Type inferred_simple + Structure inferred_position ( inferred_simple x, inferred_simple y ) + inferred_simple _22 + inferred_simple _21 + inferred_position inferred_start_position ( x = 22, y = 21 ) +} diff --git a/tr-examples/objectives.tplan2.tdltx b/tr-examples/objectives.tplan2.tdltx new file mode 100644 index 0000000..7e4af0f --- /dev/null +++ b/tr-examples/objectives.tplan2.tdltx @@ -0,0 +1,87 @@ +/* +Copyright (c) ETSI 2020. + +This software is subject to copyrights owned by ETSI. Non-exclusive permission +is hereby granted, free of charge, to copy, reproduce and amend this file +under the following conditions: It is provided "as is", without warranty of any +kind, expressed or implied. + +ETSI shall never be liable for any claim, damages, or other liability arising +from its use or inability of use.This permission does not apply to any documentation +associated with this file for which ETSI keeps all rights reserved. The present +copyright notice shall be included in all copies of whole or part of this +file and shall not imply any sub-license right. +*/ + +//Structured test objective specifications +Package objectives { + Import all from Standard + Import all from data + Import all from domain + Import all from base_configuration + Test Purpose TP_MOVE_OBJECT_LITERAL { + Objective: "Move object to destination with literal values." + PICS: MOVABLE + Expected behaviour + ensure that { + when { + the Controller entity sends the ^start position containing { + x indicating value 22, + y indicating value 21 + } + } then { + the Object entity moves_to the received ^start position + } + } + } + + Test Purpose TP_MOVE_OBJECT_PREDEFINED { + Objective: "Move object to destination with predefined values." + Expected behaviour + ensure that { + when { + the Controller entity sends the (predefined) instance startingPosition ( x = 21, y = 21) + } then { + the Object entity moves_to the (predefined) instance startingPosition + } + } + } + +// Test Purpose TP_MOVE_OBJECT_TYPED { +// Objective: "Move object to destination with typed values." +// Expected behaviour +// ensure that { +// when { +// the Controller entity sends the (typed) starting position containing +// x indicating value -22, +// y indicating value -21 +// ; +// } then { +// the Object entity moves_to the (typed) starting position +// } +// } +// } + +Objective TO_MOVE_OBJECT_UNIFIED { + Description: "Move object to destination with unified test purpose description." +} + +Test Purpose Description TP_MOVE_OBJECT_UNIFIED ( position startingPosition ) { + Objective: TO_MOVE_OBJECT_UNIFIED + Configuration: basic + Expected behaviour + ensure that { + when { + perform action: "the Controller sends the starting position" + controller::wifi sends "x=21, y=21" to object::wifi + controller::wifi sends position (x = 21, y = 21) to object::wifi + } then { + perform action: "the Object moves to the requested position" + controller::wifi receives "x=21, y=21" from object::wifi + controller::wifi receives position (x = 21, y = 21) from object::wifi + } + } +} + + +} \ No newline at end of file diff --git a/tr-examples/objectives.tplan2.tdltx.tdltx b/tr-examples/objectives.tplan2.tdltx.tdltx new file mode 100644 index 0000000..e164d0f --- /dev/null +++ b/tr-examples/objectives.tplan2.tdltx.tdltx @@ -0,0 +1,64 @@ +Package objectives { + Import all from Standard + Import all from data + Import all from domain + Import all from base_configuration + Test Purpose TP_MOVE_OBJECT_LITERAL { + Objective: "Move object to destination with literal values." + PICS: MOVABLE + Expected behaviour + ensure that { + when { + the Controller entity sends the ^start position containing { + x indicating value 22, + y indicating value 21 } + } then { + the Object entity moves_to the received ^start position + } } + } + Test Purpose TP_MOVE_OBJECT_PREDEFINED { + Objective: "Move object to destination with predefined values." + Expected behaviour + ensure that { + when { + the Controller entity sends + the + (predefined) instance startingPosition ( + x = 21, + y = 21 + ) + } then { + the Object entity moves_to + the + (predefined) instance startingPosition + } } + } + Objective TO_MOVE_OBJECT_UNIFIED { + Description: "Move object to destination with unified test purpose description." + } + Objective: TO_MOVE_OBJECT_UNIFIED + @Test Purpose Description + Test Description TP_MOVE_OBJECT_UNIFIED uses basic { + @Expected behaviour + { + @when + { + perform action : "the Controller sends the starting position" + controller::wifi sends "x=21, y=21" to object::wifi + controller::wifi sends position ( + x = 21, + y = 21 + ) to object::wifi + } + @then + { + perform action : "the Object moves to the requested position" + object::wifi sends "x=21, y=21" to controller::wifi + object::wifi sends position ( + x = 21, + y = 21 + ) to controller::wifi + } + } + } +} \ No newline at end of file diff --git a/tr-examples/objectives.tplan2.tdltx.tdltx.docx b/tr-examples/objectives.tplan2.tdltx.tdltx.docx new file mode 100644 index 0000000000000000000000000000000000000000..2c137850432dc87fb54ce1063e8cb7bab6f6798c GIT binary patch literal 11707 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 literal 0 HcmV?d00001 -- GitLab