summaryrefslogtreecommitdiff
path: root/tnslc/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tnslc/tests')
-rw-r--r--tnslc/tests/complex/enums.tnsl84
-rw-r--r--tnslc/tests/complex/generics.tnsl35
-rw-r--r--tnslc/tests/complex/if_else.tnsl46
-rw-r--r--tnslc/tests/complex/interfaces.tnsl0
-rw-r--r--tnslc/tests/complex/loops.tnsl0
-rw-r--r--tnslc/tests/complex/switch.tnsl0
-rw-r--r--tnslc/tests/simple/comments.tnsl52
-rw-r--r--tnslc/tests/simple/if_else.tnsl0
-rw-r--r--tnslc/tests/simple/includes_a.tnsl1
-rw-r--r--tnslc/tests/simple/includes_b.tnsl0
-rw-r--r--tnslc/tests/simple/modules_a.tnsl0
-rw-r--r--tnslc/tests/simple/modules_b.tnsl0
-rw-r--r--tnslc/tests/simple/structs.tnsl0
13 files changed, 218 insertions, 0 deletions
diff --git a/tnslc/tests/complex/enums.tnsl b/tnslc/tests/complex/enums.tnsl
new file mode 100644
index 0000000..80776f0
--- /dev/null
+++ b/tnslc/tests/complex/enums.tnsl
@@ -0,0 +1,84 @@
+# Enums should be able to store structs as well
+struct EnumTester {
+ int i, j
+ ~EnumTester ptr
+}
+
+# Simple integer enum
+enum IntEnum [int] {
+ A = 0,
+ B = 1,
+ C = -2
+}
+
+# Simple float enum
+enum FloatEnum[float] {
+ A = 0.1,
+ B = 0.2,
+ C = 3.1415
+}
+
+# More complex struct enum
+enum TestEnum [EnumTester] {
+ A = {1, 2, null},
+ B = {2, 3, ~TestEnum.A},
+ C = {3, 3, null}
+}
+
+# Type enum
+enum TypeEnum [type] {
+ A = int,
+ B = float,
+ C = EnumTester
+}
+
+enum SurfaceType [int] {
+ LAND = 0,
+ WATER = 1,
+ AIR = 2,
+
+ SPACE = -1
+}
+
+/; interface Vehicle
+ /; fuel [float] ;/
+ /; max_speed [float] ;/
+ /; min_speed [float] ;/
+ /; can_travel (SurfaceType surface) [bool] ;/
+;/
+
+struct Car extends Vehicle {
+ int wheels
+}
+
+struct Boat extends Vehicle {
+ int propellers
+}
+
+struct Plane extends Vehicle {
+ bool biplane, passenger
+ int engines,
+}
+
+struct Rocket extends Vehicle {
+ int
+ engines,
+ stages
+}
+
+struct HoverCraft extends Vehicle {
+ {3}float
+ max_antigrav,
+ bool
+ space_ready
+}
+
+# Enums can also handle interfaces (and extended types)
+# but only if the given standard library has support for those things
+enum CommonVehicles [Vehicle] {
+ A = {4}[Car],
+ B = {1}[Boat],
+ C = {false, true, 2}[Plane],
+ D = {4, 5}[Rocket],
+ E = {{5, 14.8, 5}, false}[HoverCraft]
+}
diff --git a/tnslc/tests/complex/generics.tnsl b/tnslc/tests/complex/generics.tnsl
new file mode 100644
index 0000000..3f62474
--- /dev/null
+++ b/tnslc/tests/complex/generics.tnsl
@@ -0,0 +1,35 @@
+struct ListNode (type T) {
+ T element,
+ ~ListNode(T) next
+}
+
+/; method ListNode
+ /; get_el [T]
+ return self.element
+ ;/
+
+ /; get_next [ListNode(T)]
+ return self.next`
+ ;/
+;/
+
+struct ReferenceNode (type T) extends ListNode(T`) {
+ super
+}
+
+/; method ReferenceNode
+ /; change_ref (~T new_ref)
+ ~self.element = new_ref
+ ;/
+;/
+
+struct List(type T) {
+
+}
+
+# Generic (type T)
+# Unknown generic (?)
+# Ref to a type (type T) -> T`
+# Ref types can be used interchangably with their referenced type while pointer types can not
+# Variables typed by reference have the additional trait that you can
+# set the address of that variable \ No newline at end of file
diff --git a/tnslc/tests/complex/if_else.tnsl b/tnslc/tests/complex/if_else.tnsl
new file mode 100644
index 0000000..d965e6b
--- /dev/null
+++ b/tnslc/tests/complex/if_else.tnsl
@@ -0,0 +1,46 @@
+/; main [int]
+ /; if ()
+
+ ;/
+
+ /; if ()
+
+ ;; else
+
+ ;/
+
+ /; if ()
+
+ ;//; else
+
+ ;/
+
+ /; if ()
+
+ ;; else if ()
+
+ ;/
+
+ /; if () []
+ ;; else if () []
+ ;; else []
+ ;/
+
+ /; if () []
+ ;; if () []
+ ;; else []
+ ;/
+
+ /; if () []
+ ;; if () []
+ ;; else if () []
+ ;; else []
+ ;/
+
+ int i = 0
+
+ # Short if syntax for variable declaration
+ i = if (i < 1) [7] else [9]
+
+ ;return 0
+;/ \ No newline at end of file
diff --git a/tnslc/tests/complex/interfaces.tnsl b/tnslc/tests/complex/interfaces.tnsl
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tnslc/tests/complex/interfaces.tnsl
diff --git a/tnslc/tests/complex/loops.tnsl b/tnslc/tests/complex/loops.tnsl
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tnslc/tests/complex/loops.tnsl
diff --git a/tnslc/tests/complex/switch.tnsl b/tnslc/tests/complex/switch.tnsl
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tnslc/tests/complex/switch.tnsl
diff --git a/tnslc/tests/simple/comments.tnsl b/tnslc/tests/simple/comments.tnsl
new file mode 100644
index 0000000..dbece20
--- /dev/null
+++ b/tnslc/tests/simple/comments.tnsl
@@ -0,0 +1,52 @@
+# These are tests for where comments may be located
+# as well as the type of comments that may be parsed.
+# A '#' denotes a single line comment, and will
+# ignore everything on the line.
+# '/#' denotes the start of a multi line comment
+# if you want to use '#/' (the end of a multiline comment)
+# inside of a multiline comment, use '#' at the start of the line
+# to escape the whole line.
+
+/#
+ This is an example
+ of a multiline comment.
+#/
+
+/#
+# This is also a multiline comment
+# however, you can use #/
+# inside of it because we have '#' at
+# the start of each line
+#/
+
+/##
+# This is an example of a doc comment.
+# It is a doc comment of a code block because it starts with '/##' instead of '/#'
+# and ends with '# ;' which ends the comment and opens a block.
+# This doc comment is on the main function
+#; main /# Comment inside function declaration #/ [int /# Comment inside this list of outputs #/ ]
+ return 0 # line comment inside a function
+ /# Block comment inside function #/
+;/
+
+/# Comment before block opens #/ /; interface /# Comment in interface block definition #/ ITest
+ # Comment in interface block
+ /; test_method [int] ;/
+/# Comment before block closes #/ ;/
+
+struct Test {
+ # comment inside a list of member variables
+ int /# Comment btwn type and variable name #/ i
+}
+
+/; method /# Comment in method block definition #/ Test
+ # Comment in method block
+ /; /# Comment before method name#/ test_method (/# Comment inside function params #/) [/# comment inside return type again#/ int]
+/# Comment at start of line before statement#/ return /# Comment btwn return and value #/ i
+ ;/
+
+ /; cf_comment [int]
+
+ ;/
+;/
+
diff --git a/tnslc/tests/simple/if_else.tnsl b/tnslc/tests/simple/if_else.tnsl
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tnslc/tests/simple/if_else.tnsl
diff --git a/tnslc/tests/simple/includes_a.tnsl b/tnslc/tests/simple/includes_a.tnsl
new file mode 100644
index 0000000..930098a
--- /dev/null
+++ b/tnslc/tests/simple/includes_a.tnsl
@@ -0,0 +1 @@
+:include "includes_b.tnsl" \ No newline at end of file
diff --git a/tnslc/tests/simple/includes_b.tnsl b/tnslc/tests/simple/includes_b.tnsl
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tnslc/tests/simple/includes_b.tnsl
diff --git a/tnslc/tests/simple/modules_a.tnsl b/tnslc/tests/simple/modules_a.tnsl
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tnslc/tests/simple/modules_a.tnsl
diff --git a/tnslc/tests/simple/modules_b.tnsl b/tnslc/tests/simple/modules_b.tnsl
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tnslc/tests/simple/modules_b.tnsl
diff --git a/tnslc/tests/simple/structs.tnsl b/tnslc/tests/simple/structs.tnsl
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tnslc/tests/simple/structs.tnsl