aboutsummaryrefslogtreecommitdiff
path: root/ql/test/semantic_analysis
diff options
context:
space:
mode:
Diffstat (limited to 'ql/test/semantic_analysis')
-rw-r--r--ql/test/semantic_analysis/__pycache__/test_semantic_analysis.cpython-35.pycbin0 -> 1778 bytes
-rw-r--r--ql/test/semantic_analysis/invalid/test001.ql9
-rw-r--r--ql/test/semantic_analysis/invalid/test002.ql9
-rw-r--r--ql/test/semantic_analysis/invalid/test003.ql13
-rw-r--r--ql/test/semantic_analysis/invalid/test004.ql11
-rw-r--r--ql/test/semantic_analysis/invalid/test005.ql5
-rw-r--r--ql/test/semantic_analysis/invalid/test006.ql7
-rw-r--r--ql/test/semantic_analysis/invalid/test007.ql9
-rw-r--r--ql/test/semantic_analysis/invalid/test008.ql7
-rw-r--r--ql/test/semantic_analysis/invalid/test009.ql7
-rw-r--r--ql/test/semantic_analysis/invalid/test010.ql5
-rw-r--r--ql/test/semantic_analysis/invalid/test011.ql5
-rw-r--r--ql/test/semantic_analysis/invalid/test012.ql5
-rw-r--r--ql/test/semantic_analysis/invalid/test013.ql5
-rw-r--r--ql/test/semantic_analysis/invalid/test014.ql5
-rw-r--r--ql/test/semantic_analysis/invalid/test015.ql5
-rw-r--r--ql/test/semantic_analysis/invalid/test016.ql5
-rw-r--r--ql/test/semantic_analysis/invalid/test017.ql5
-rw-r--r--ql/test/semantic_analysis/invalid/test018.ql5
-rw-r--r--ql/test/semantic_analysis/invalid/test019.ql5
-rw-r--r--ql/test/semantic_analysis/invalid/test020.ql5
-rw-r--r--ql/test/semantic_analysis/invalid/test021.ql5
-rw-r--r--ql/test/semantic_analysis/invalid/test022.ql5
-rw-r--r--ql/test/semantic_analysis/invalid/test023.ql5
-rw-r--r--ql/test/semantic_analysis/invalid/test024.ql5
-rw-r--r--ql/test/semantic_analysis/invalid/test025.ql5
-rw-r--r--ql/test/semantic_analysis/invalid/test026.ql5
-rw-r--r--ql/test/semantic_analysis/invalid/test027.ql5
-rw-r--r--ql/test/semantic_analysis/invalid/test028.ql5
-rw-r--r--ql/test/semantic_analysis/invalid/test029.ql5
-rw-r--r--ql/test/semantic_analysis/invalid/test030.ql7
-rw-r--r--ql/test/semantic_analysis/invalid/test031.ql5
-rw-r--r--ql/test/semantic_analysis/invalid/test032.ql5
-rw-r--r--ql/test/semantic_analysis/test_semantic_analysis.py39
-rw-r--r--ql/test/semantic_analysis/valid/test001.ql9
-rw-r--r--ql/test/semantic_analysis/valid/test002.ql7
-rw-r--r--ql/test/semantic_analysis/valid/test003.ql9
-rw-r--r--ql/test/semantic_analysis/valid/test004.ql7
-rw-r--r--ql/test/semantic_analysis/valid/test005.ql15
-rw-r--r--ql/test/semantic_analysis/valid/test006.ql13
-rw-r--r--ql/test/semantic_analysis/valid/test007.ql9
-rw-r--r--ql/test/semantic_analysis/valid/test008.ql9
-rw-r--r--ql/test/semantic_analysis/valid/test009.ql7
-rw-r--r--ql/test/semantic_analysis/valid/test010.ql5
-rw-r--r--ql/test/semantic_analysis/valid/test011.ql5
-rw-r--r--ql/test/semantic_analysis/valid/test012.ql5
-rw-r--r--ql/test/semantic_analysis/valid/test013.ql5
-rw-r--r--ql/test/semantic_analysis/valid/test014.ql5
-rw-r--r--ql/test/semantic_analysis/valid/test015.ql5
-rw-r--r--ql/test/semantic_analysis/valid/test016.ql5
-rw-r--r--ql/test/semantic_analysis/valid/test017.ql5
-rw-r--r--ql/test/semantic_analysis/valid/test018.ql5
-rw-r--r--ql/test/semantic_analysis/valid/test019.ql5
-rw-r--r--ql/test/semantic_analysis/valid/test020.ql7
-rw-r--r--ql/test/semantic_analysis/valid/test021.ql5
55 files changed, 380 insertions, 0 deletions
diff --git a/ql/test/semantic_analysis/__pycache__/test_semantic_analysis.cpython-35.pyc b/ql/test/semantic_analysis/__pycache__/test_semantic_analysis.cpython-35.pyc
new file mode 100644
index 0000000..5b92465
--- /dev/null
+++ b/ql/test/semantic_analysis/__pycache__/test_semantic_analysis.cpython-35.pyc
Binary files differ
diff --git a/ql/test/semantic_analysis/invalid/test001.ql b/ql/test/semantic_analysis/invalid/test001.ql
new file mode 100644
index 0000000..42b1b41
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test001.ql
@@ -0,0 +1,9 @@
+// Reference to unknown identifier in condition
+form testForm {
+ if (unknownIdentifier) {
+ "First Question"
+ anotherIdentifier : integer
+ }
+ "Second Question"
+ testIdentifier : boolean
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test002.ql b/ql/test/semantic_analysis/invalid/test002.ql
new file mode 100644
index 0000000..856447d
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test002.ql
@@ -0,0 +1,9 @@
+// Reference to unknown identifier in computed question
+form testForm {
+ "First Question"
+ testIdentifier : integer
+ "Second Question"
+ anotherIdentifier : integer = testIdentifier + unknownIdentifier
+}
+
+
diff --git a/ql/test/semantic_analysis/invalid/test003.ql b/ql/test/semantic_analysis/invalid/test003.ql
new file mode 100644
index 0000000..1491a85
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test003.ql
@@ -0,0 +1,13 @@
+// Reference to identifier in condition out of scope
+form testForm {
+ "First Question"
+ testIdentifier : boolean
+ if (testIdentifier) {
+ "Second Question"
+ anotherIdentifier : integer
+ }
+ if (anotherIdentifier) {
+ "Unreachable Question"
+ unreachableIdentifier : integer
+ }
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test004.ql b/ql/test/semantic_analysis/invalid/test004.ql
new file mode 100644
index 0000000..5ae3e94
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test004.ql
@@ -0,0 +1,11 @@
+// Reference to identifier in computed question out of scope
+form testForm {
+ "First Question"
+ testIdentifier : boolean
+ if (testIdentifier) {
+ "Second Question"
+ anotherIdentifier : integer
+ }
+ "Third Question"
+ unknownIdentifier : integer = anotherIdentifier + 1
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test005.ql b/ql/test/semantic_analysis/invalid/test005.ql
new file mode 100644
index 0000000..de066f2
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test005.ql
@@ -0,0 +1,5 @@
+// Identifier dependent on itself (reflexive)
+form testForm {
+ "First Question"
+ firstIdentifier : integer = firstIdentifier + 1
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test006.ql b/ql/test/semantic_analysis/invalid/test006.ql
new file mode 100644
index 0000000..12cf8f0
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test006.ql
@@ -0,0 +1,7 @@
+// Identifiers dependent on each other (symmetric)
+form testForm {
+ "First Question"
+ firstIdentifier : integer = secondIdentifier + 1
+ "Second Question"
+ secondIdentifier : integer = firstIdentifier + 1
+}
diff --git a/ql/test/semantic_analysis/invalid/test007.ql b/ql/test/semantic_analysis/invalid/test007.ql
new file mode 100644
index 0000000..08f4f5f
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test007.ql
@@ -0,0 +1,9 @@
+// Identifiers dependent on each other (transitive)
+form testForm {
+ "First Question"
+ firstIdentifier : integer = secondIdentifier + 1
+ "Second Question"
+ secondIdentifier : integer = thirdIdentifier + 1
+ "Third Question"
+ thirdIdentifier : integer = firstIdentifier + 1
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test008.ql b/ql/test/semantic_analysis/invalid/test008.ql
new file mode 100644
index 0000000..6c8a660
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test008.ql
@@ -0,0 +1,7 @@
+// Different questions with equal identifier
+form testForm {
+ "First Question"
+ someIdentifier : integer
+ "Second Question"
+ someIdentifier : decimal
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test009.ql b/ql/test/semantic_analysis/invalid/test009.ql
new file mode 100644
index 0000000..362a2b1
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test009.ql
@@ -0,0 +1,7 @@
+// Equal questions with different types
+form testForm {
+ "First Question"
+ someIdentifier : integer
+ "First Question"
+ someIdentifier : decimal
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test010.ql b/ql/test/semantic_analysis/invalid/test010.ql
new file mode 100644
index 0000000..30a03e2
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test010.ql
@@ -0,0 +1,5 @@
+// Incompatible types for addition operation
+form testForm {
+ "First Question"
+ someIdentifier : decimal = 10.0 + True
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test011.ql b/ql/test/semantic_analysis/invalid/test011.ql
new file mode 100644
index 0000000..de59f13
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test011.ql
@@ -0,0 +1,5 @@
+// Incompatible types for subtraction operation
+form testForm {
+ "First Question"
+ someIdentifier : decimal = 10.0 - True
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test012.ql b/ql/test/semantic_analysis/invalid/test012.ql
new file mode 100644
index 0000000..006bd0c
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test012.ql
@@ -0,0 +1,5 @@
+// Incompatible types for greater equals operation
+form testForm {
+ "First Question"
+ someIdentifier : boolean = 10.0 >= True
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test013.ql b/ql/test/semantic_analysis/invalid/test013.ql
new file mode 100644
index 0000000..2896f80
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test013.ql
@@ -0,0 +1,5 @@
+// Incompatible types for greater than operation
+form testForm {
+ "First Question"
+ someIdentifier : boolean = 10.0 > True
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test014.ql b/ql/test/semantic_analysis/invalid/test014.ql
new file mode 100644
index 0000000..b5b7774
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test014.ql
@@ -0,0 +1,5 @@
+// Incompatible types for less equals operation
+form testForm {
+ "First Question"
+ someIdentifier : boolean = 10.0 <= True
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test015.ql b/ql/test/semantic_analysis/invalid/test015.ql
new file mode 100644
index 0000000..6c52b37
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test015.ql
@@ -0,0 +1,5 @@
+// Incompatible types for less than operation
+form testForm {
+ "First Question"
+ someIdentifier : boolean = 10.0 < True
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test016.ql b/ql/test/semantic_analysis/invalid/test016.ql
new file mode 100644
index 0000000..dcf98ea
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test016.ql
@@ -0,0 +1,5 @@
+// Incompatible types for and operation
+form testForm {
+ "First Question"
+ someIdentifier : boolean = 10.0 && True
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test017.ql b/ql/test/semantic_analysis/invalid/test017.ql
new file mode 100644
index 0000000..9eef105
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test017.ql
@@ -0,0 +1,5 @@
+// Incompatible types for or operation
+form testForm {
+ "First Question"
+ someIdentifier : boolean = 10.0 || True
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test018.ql b/ql/test/semantic_analysis/invalid/test018.ql
new file mode 100644
index 0000000..bd18cf9
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test018.ql
@@ -0,0 +1,5 @@
+// Incompatible types for multiplication operation
+form testForm {
+ "First Question"
+ someIdentifier : decimal = 10.0 * True
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test019.ql b/ql/test/semantic_analysis/invalid/test019.ql
new file mode 100644
index 0000000..69a2c38
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test019.ql
@@ -0,0 +1,5 @@
+// Incompatible types for division operation
+form testForm {
+ "First Question"
+ someIdentifier : decimal = 10.0 / True
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test020.ql b/ql/test/semantic_analysis/invalid/test020.ql
new file mode 100644
index 0000000..538bdf9
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test020.ql
@@ -0,0 +1,5 @@
+// Incompatible result type for addition operation
+form testForm {
+ "First Question"
+ someIdentifier : integer = 10.1 + 10
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test021.ql b/ql/test/semantic_analysis/invalid/test021.ql
new file mode 100644
index 0000000..74e596d
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test021.ql
@@ -0,0 +1,5 @@
+// Incompatible result type for subtraction operation
+form testForm {
+ "First Question"
+ someIdentifier : integer = 10.1 - 10
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test022.ql b/ql/test/semantic_analysis/invalid/test022.ql
new file mode 100644
index 0000000..9cf774a
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test022.ql
@@ -0,0 +1,5 @@
+// Incompatible result type for greater equals operation
+form testForm {
+ "First Question"
+ someIdentifier : integer = 10.0 >= 10
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test023.ql b/ql/test/semantic_analysis/invalid/test023.ql
new file mode 100644
index 0000000..f7d674b
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test023.ql
@@ -0,0 +1,5 @@
+// Incompatible result type for greater than operation
+form testForm {
+ "First Question"
+ someIdentifier : integer = 10.0 > 10
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test024.ql b/ql/test/semantic_analysis/invalid/test024.ql
new file mode 100644
index 0000000..f262f5c
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test024.ql
@@ -0,0 +1,5 @@
+// Incompatible result type for less equals operation
+form testForm {
+ "First Question"
+ someIdentifier : integer = 10.0 <= 10
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test025.ql b/ql/test/semantic_analysis/invalid/test025.ql
new file mode 100644
index 0000000..ef823b5
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test025.ql
@@ -0,0 +1,5 @@
+// Incompatible result type for less than operation
+form testForm {
+ "First Question"
+ someIdentifier : integer = 10.0 < 10
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test026.ql b/ql/test/semantic_analysis/invalid/test026.ql
new file mode 100644
index 0000000..b1e8a5b
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test026.ql
@@ -0,0 +1,5 @@
+// Incompatible result type for and operation
+form testForm {
+ "First Question"
+ someIdentifier : integer = True && True
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test027.ql b/ql/test/semantic_analysis/invalid/test027.ql
new file mode 100644
index 0000000..262aa0e
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test027.ql
@@ -0,0 +1,5 @@
+// Incompatible result type for or operation
+form testForm {
+ "First Question"
+ someIdentifier : integer = False || True
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test028.ql b/ql/test/semantic_analysis/invalid/test028.ql
new file mode 100644
index 0000000..ea02ccd
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test028.ql
@@ -0,0 +1,5 @@
+// Incompatible result type for multiplication operation
+form testForm {
+ "First Question"
+ someIdentifier : integer = 10.1 * 10
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test029.ql b/ql/test/semantic_analysis/invalid/test029.ql
new file mode 100644
index 0000000..23f3c78
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test029.ql
@@ -0,0 +1,5 @@
+// Incompatible result type for division operation
+form testForm {
+ "First Question"
+ someIdentifier : integer = 10.1 / 10
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test030.ql b/ql/test/semantic_analysis/invalid/test030.ql
new file mode 100644
index 0000000..3de208c
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test030.ql
@@ -0,0 +1,7 @@
+// Complex condition with incompatible types
+form testForm {
+ if ((15.5 >= 15) && ((3.0 * True) - 15 > -10 / 2)) {
+ "First Question"
+ someIdentifier : integer
+ }
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test031.ql b/ql/test/semantic_analysis/invalid/test031.ql
new file mode 100644
index 0000000..0d6f75c
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test031.ql
@@ -0,0 +1,5 @@
+// Complex computed question with incompatible types
+form testForm {
+ "First Question"
+ someIdentifier : boolean = (25.5 >= True) && ((10.0 / 3) - 15 < -10 * 2)
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/invalid/test032.ql b/ql/test/semantic_analysis/invalid/test032.ql
new file mode 100644
index 0000000..9de5ff2
--- /dev/null
+++ b/ql/test/semantic_analysis/invalid/test032.ql
@@ -0,0 +1,5 @@
+// Complex computed question with incompatible result type
+form testForm {
+ "First Question"
+ someIdentifier : integer = (25.5 >= 10) && ((10.0 / 3) - 15 < -10 * 2)
+}
diff --git a/ql/test/semantic_analysis/test_semantic_analysis.py b/ql/test/semantic_analysis/test_semantic_analysis.py
new file mode 100644
index 0000000..ca01231
--- /dev/null
+++ b/ql/test/semantic_analysis/test_semantic_analysis.py
@@ -0,0 +1,39 @@
+from ql.ast.checkers.dependency_checker import DependencyChecker
+from ql.ast.checkers.question_checker import QuestionChecker
+from ql.ast.checkers.reference_checker import ReferenceChecker
+from ql.ast.extractors.extractor import extract_identifier_dependencies
+from ql.ast.extractors.extractor import extract_identifier_scopes
+from ql.ast.extractors.extractor import extract_identifier_types
+from ql.ast.extractors.extractor import extract_questions
+from ql.ast.visitors.type_visitor import TypeVisitor
+from ql.test.test import Test
+
+
+class TestSemanticAnalysis(Test):
+ def __init__(self, directory, lexer, parser):
+ super(TestSemanticAnalysis, self).__init__('semantic analysis', directory)
+ self.__lexer = lexer
+ self.__parser = parser
+
+ def test_file(self, file):
+ ast = self.__parser.parse(file, self.__lexer.lexer)
+
+ reference_errors = ReferenceChecker(extract_identifier_scopes(ast)).errors
+ if reference_errors:
+ return False
+
+ dependency_errors = DependencyChecker(extract_identifier_dependencies(ast)).errors
+ if dependency_errors:
+ return False
+
+ question_errors = QuestionChecker(extract_questions(ast)).errors
+ if question_errors:
+ return False
+
+ type_visitor = TypeVisitor(extract_identifier_types(ast))
+ type_visitor.visit(ast)
+ type_errors = type_visitor.errors
+ if type_errors:
+ return False
+
+ return True
diff --git a/ql/test/semantic_analysis/valid/test001.ql b/ql/test/semantic_analysis/valid/test001.ql
new file mode 100644
index 0000000..d9d037f
--- /dev/null
+++ b/ql/test/semantic_analysis/valid/test001.ql
@@ -0,0 +1,9 @@
+// Identifier reference in condition
+form testForm {
+ "First Question"
+ testIdentifier : boolean
+ if (testIdentifier) {
+ "Second Question"
+ anotherIdentifier : integer
+ }
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/valid/test002.ql b/ql/test/semantic_analysis/valid/test002.ql
new file mode 100644
index 0000000..afe1f5c
--- /dev/null
+++ b/ql/test/semantic_analysis/valid/test002.ql
@@ -0,0 +1,7 @@
+// Identifier reference in computed question
+form testForm {
+ "First Question"
+ testIdentifier : integer
+ "Second Question"
+ anotherIdentifier : integer = testIdentifier
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/valid/test003.ql b/ql/test/semantic_analysis/valid/test003.ql
new file mode 100644
index 0000000..b89d0c1
--- /dev/null
+++ b/ql/test/semantic_analysis/valid/test003.ql
@@ -0,0 +1,9 @@
+// Identifier declared after reference in condition
+form testForm {
+ if (testIdentifier) {
+ "First Question"
+ anotherIdentifier : integer
+ }
+ "Second Question"
+ testIdentifier : boolean
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/valid/test004.ql b/ql/test/semantic_analysis/valid/test004.ql
new file mode 100644
index 0000000..8f4feb0
--- /dev/null
+++ b/ql/test/semantic_analysis/valid/test004.ql
@@ -0,0 +1,7 @@
+// Identifier declared after reference in computed question
+form testForm {
+ "First Question"
+ anotherIdentifier : integer = testIdentifier + 1
+ "Second Question"
+ testIdentifier : integer
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/valid/test005.ql b/ql/test/semantic_analysis/valid/test005.ql
new file mode 100644
index 0000000..8620dc9
--- /dev/null
+++ b/ql/test/semantic_analysis/valid/test005.ql
@@ -0,0 +1,15 @@
+// Identifier reference in nested condition
+form testForm {
+ "First Question"
+ firstCondition : boolean
+ "Second Question"
+ secondCondition : boolean
+ if (firstCondition) {
+ "Third Question"
+ anotherIdentifier : integer
+ if (secondCondition) {
+ "Fourth Question"
+ yetAnotherIdentifier : decimal
+ }
+ }
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/valid/test006.ql b/ql/test/semantic_analysis/valid/test006.ql
new file mode 100644
index 0000000..855332e
--- /dev/null
+++ b/ql/test/semantic_analysis/valid/test006.ql
@@ -0,0 +1,13 @@
+// Identifier reference in nested computed question
+form testForm {
+ "First Question"
+ firstCondition : boolean
+ "Second Question"
+ firstInteger : integer
+ if (firstCondition) {
+ "Third Question"
+ anotherIdentifier : integer
+ "Fourth Question"
+ yetAnotherIdentifier : integer = firstInteger + 1
+ }
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/valid/test007.ql b/ql/test/semantic_analysis/valid/test007.ql
new file mode 100644
index 0000000..1338a82
--- /dev/null
+++ b/ql/test/semantic_analysis/valid/test007.ql
@@ -0,0 +1,9 @@
+// Identifier reference in both condition and computed question
+form testForm {
+ "First Question"
+ someInteger : integer
+ if (someInteger > 10) {
+ "Second Question"
+ computedInteger : integer = someInteger - 10
+ }
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/valid/test008.ql b/ql/test/semantic_analysis/valid/test008.ql
new file mode 100644
index 0000000..80205a5
--- /dev/null
+++ b/ql/test/semantic_analysis/valid/test008.ql
@@ -0,0 +1,9 @@
+// Identifier dependant on second, second dependant on third
+form testForm {
+ "First Question"
+ firstIdentifier : integer = secondIdentifier + 1
+ "Second Question"
+ secondIdentifier : integer = thirdIdentifier + 1
+ "Third Question"
+ thirdIdentifier : integer
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/valid/test009.ql b/ql/test/semantic_analysis/valid/test009.ql
new file mode 100644
index 0000000..7e92ad7
--- /dev/null
+++ b/ql/test/semantic_analysis/valid/test009.ql
@@ -0,0 +1,7 @@
+// Different questions with equal labels
+form testForm {
+ "First Question"
+ someIdentifier : integer
+ "First Question"
+ anotherIdentifier : decimal
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/valid/test010.ql b/ql/test/semantic_analysis/valid/test010.ql
new file mode 100644
index 0000000..eca4ad4
--- /dev/null
+++ b/ql/test/semantic_analysis/valid/test010.ql
@@ -0,0 +1,5 @@
+// Compatible types for addition operation
+form testForm {
+ "First Question"
+ someIdentifier : decimal = 10.0 + 10
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/valid/test011.ql b/ql/test/semantic_analysis/valid/test011.ql
new file mode 100644
index 0000000..f47b435
--- /dev/null
+++ b/ql/test/semantic_analysis/valid/test011.ql
@@ -0,0 +1,5 @@
+// Compatible types for subtraction operation
+form testForm {
+ "First Question"
+ someIdentifier : decimal = 10.0 - 10
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/valid/test012.ql b/ql/test/semantic_analysis/valid/test012.ql
new file mode 100644
index 0000000..2e7e278
--- /dev/null
+++ b/ql/test/semantic_analysis/valid/test012.ql
@@ -0,0 +1,5 @@
+// Compatible types for greater equals operation
+form testForm {
+ "First Question"
+ someIdentifier : boolean = 10.0 == 10
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/valid/test013.ql b/ql/test/semantic_analysis/valid/test013.ql
new file mode 100644
index 0000000..a34566c
--- /dev/null
+++ b/ql/test/semantic_analysis/valid/test013.ql
@@ -0,0 +1,5 @@
+// Compatible types for greater than operation
+form testForm {
+ "First Question"
+ someIdentifier : boolean = 10.0 > 10
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/valid/test014.ql b/ql/test/semantic_analysis/valid/test014.ql
new file mode 100644
index 0000000..7ee1b86
--- /dev/null
+++ b/ql/test/semantic_analysis/valid/test014.ql
@@ -0,0 +1,5 @@
+// Compatible types for less equals operation
+form testForm {
+ "First Question"
+ someIdentifier : boolean = 10.0 <= 10
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/valid/test015.ql b/ql/test/semantic_analysis/valid/test015.ql
new file mode 100644
index 0000000..431c1f0
--- /dev/null
+++ b/ql/test/semantic_analysis/valid/test015.ql
@@ -0,0 +1,5 @@
+// Compatible types for less than operation
+form testForm {
+ "First Question"
+ someIdentifier : boolean = 10.0 < 10
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/valid/test016.ql b/ql/test/semantic_analysis/valid/test016.ql
new file mode 100644
index 0000000..8b0bdde
--- /dev/null
+++ b/ql/test/semantic_analysis/valid/test016.ql
@@ -0,0 +1,5 @@
+// Compatible types for and operation
+form testForm {
+ "First Question"
+ someIdentifier : boolean = True && False
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/valid/test017.ql b/ql/test/semantic_analysis/valid/test017.ql
new file mode 100644
index 0000000..851e5ff
--- /dev/null
+++ b/ql/test/semantic_analysis/valid/test017.ql
@@ -0,0 +1,5 @@
+// Compatible types for or operation
+form testForm {
+ "First Question"
+ someIdentifier : boolean = False || True
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/valid/test018.ql b/ql/test/semantic_analysis/valid/test018.ql
new file mode 100644
index 0000000..41d439f
--- /dev/null
+++ b/ql/test/semantic_analysis/valid/test018.ql
@@ -0,0 +1,5 @@
+// Compatible types for multiplication operation
+form testForm {
+ "First Question"
+ someIdentifier : decimal = 10.0 * 10
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/valid/test019.ql b/ql/test/semantic_analysis/valid/test019.ql
new file mode 100644
index 0000000..36ba458
--- /dev/null
+++ b/ql/test/semantic_analysis/valid/test019.ql
@@ -0,0 +1,5 @@
+// Compatible types for division operation
+form testForm {
+ "First Question"
+ someIdentifier : decimal = 10.0 / 10
+}
diff --git a/ql/test/semantic_analysis/valid/test020.ql b/ql/test/semantic_analysis/valid/test020.ql
new file mode 100644
index 0000000..9fff193
--- /dev/null
+++ b/ql/test/semantic_analysis/valid/test020.ql
@@ -0,0 +1,7 @@
+// Complex condition with mixed types
+form testForm {
+ if ((15.5 >= 15) && ((3.0 * 3) - 15 > -10 / 2)) {
+ "First Question"
+ someIdentifier : integer
+ }
+} \ No newline at end of file
diff --git a/ql/test/semantic_analysis/valid/test021.ql b/ql/test/semantic_analysis/valid/test021.ql
new file mode 100644
index 0000000..01ec35c
--- /dev/null
+++ b/ql/test/semantic_analysis/valid/test021.ql
@@ -0,0 +1,5 @@
+// Complex computed question with mixed types
+form testForm {
+ "First Question"
+ someIdentifier : boolean = (25.5 >= 10) && ((10.0 / 3) - 15 < -10 * 2)
+} \ No newline at end of file