aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2024-08-30 11:58:18 +0100
committerGitHub <noreply@github.com>2024-08-30 11:58:18 +0100
commit773703bc83c05eb799359d6d65d32717796c19e0 (patch)
tree945970e7ef45f1e5e301760c4e3e7af88d1e949e /tests
parenta4e865f90bd3a6f7e5ff004d691863827d0b9399 (diff)
parent655610ec879de4dd56cb3a7f58925f18471c93d2 (diff)
Merge pull request #4009 from thetarnav/file-tag-parser
Add a file tag parser to core:odin/parser
Diffstat (limited to 'tests')
-rw-r--r--tests/core/odin/test_file_tags.odin155
1 files changed, 155 insertions, 0 deletions
diff --git a/tests/core/odin/test_file_tags.odin b/tests/core/odin/test_file_tags.odin
new file mode 100644
index 000000000..4af1afc75
--- /dev/null
+++ b/tests/core/odin/test_file_tags.odin
@@ -0,0 +1,155 @@
+package test_core_odin_parser
+
+import "base:runtime"
+import "core:testing"
+import "core:slice"
+import "core:odin/ast"
+import "core:odin/parser"
+
+@test
+test_parse_file_tags :: proc(t: ^testing.T) {
+ context.allocator = context.temp_allocator
+ runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD()
+
+ Test_Case :: struct {
+ src: string,
+ tags: parser.File_Tags,
+ matching_targets: []struct{
+ target: parser.Build_Target,
+ result: bool,
+ },
+ }
+
+ test_cases := []Test_Case{
+ {// [0]
+ src = ``,
+ tags = {},
+ }, {// [1]
+ src = `
+package main
+ `,
+ tags = {},
+ matching_targets = {
+ {{.Windows, .amd64, "foo"}, true},
+ },
+ }, {// [2]
+ src = `
+//+build linux, darwin, freebsd, openbsd, netbsd, haiku
+//+build arm32, arm64
+package main
+ `,
+ tags = {
+ build = {
+ {os = {.Linux}, arch = runtime.ALL_ODIN_ARCH_TYPES},
+ {os = {.Darwin}, arch = runtime.ALL_ODIN_ARCH_TYPES},
+ {os = {.FreeBSD}, arch = runtime.ALL_ODIN_ARCH_TYPES},
+ {os = {.OpenBSD}, arch = runtime.ALL_ODIN_ARCH_TYPES},
+ {os = {.NetBSD}, arch = runtime.ALL_ODIN_ARCH_TYPES},
+ {os = {.Haiku}, arch = runtime.ALL_ODIN_ARCH_TYPES},
+ {os = runtime.ALL_ODIN_OS_TYPES, arch = {.arm32}},
+ {os = runtime.ALL_ODIN_OS_TYPES, arch = {.arm64}},
+ },
+ },
+ matching_targets = {
+ {{.Linux, .amd64, "foo"}, true},
+ {{.Windows, .arm64, "foo"}, true},
+ {{.Windows, .amd64, "foo"}, false},
+ },
+ }, {// [3]
+ src = `
+// +private
+//+lazy
+// +no-instrumentation
+//+ignore
+// some other comment
+package main
+ `,
+ tags = {
+ private = .Package,
+ no_instrumentation = true,
+ lazy = true,
+ ignore = true,
+ },
+ matching_targets = {
+ {{.Linux, .amd64, "foo"}, false},
+ },
+ }, {// [4]
+ src = `
+//+build-project-name foo !bar, baz
+//+build js wasm32, js wasm64p32
+package main
+ `,
+ tags = {
+ build_project_name = {{"foo", "!bar"}, {"baz"}},
+ build = {
+ {
+ os = {.JS},
+ arch = {.wasm32},
+ }, {
+ os = {.JS},
+ arch = {.wasm64p32},
+ },
+ },
+ },
+ matching_targets = {
+ {{.JS, .wasm32, "foo"}, true},
+ {{.JS, .wasm64p32, "baz"}, true},
+ {{.JS, .wasm64p32, "bar"}, false},
+ },
+ },
+ }
+
+ for test_case, test_case_i in test_cases {
+
+ file := ast.File{
+ fullpath = "test.odin",
+ src = test_case.src,
+ }
+
+ p := parser.default_parser()
+ ok := parser.parse_file(&p, &file)
+
+ testing.expect(t, ok, "bad parse")
+
+ tags := parser.parse_file_tags(file)
+
+
+ build_project_name_the_same: bool
+ check: if len(test_case.tags.build_project_name) == len(tags.build_project_name) {
+ for tag, i in test_case.tags.build_project_name {
+ slice.equal(tag, tags.build_project_name[i]) or_break check
+ }
+ build_project_name_the_same = true
+ }
+ testing.expectf(t, build_project_name_the_same,
+ "[%d] file_tags.build_project_name expected:\n%#v, got:\n%#v",
+ test_case_i, test_case.tags.build_project_name, tags.build_project_name)
+
+ testing.expectf(t, slice.equal(test_case.tags.build, tags.build),
+ "[%d] file_tags.build expected:\n%#v, got:\n%#v",
+ test_case_i, test_case.tags.build, tags.build)
+
+ testing.expectf(t, test_case.tags.private == tags.private,
+ "[%d] file_tags.private expected:\n%v, got:\n%v",
+ test_case_i, test_case.tags.private, tags.private)
+
+ testing.expectf(t, test_case.tags.ignore == tags.ignore,
+ "[%d] file_tags.ignore expected:\n%v, got:\n%v",
+ test_case_i, test_case.tags.ignore, tags.ignore)
+
+ testing.expectf(t, test_case.tags.lazy == tags.lazy,
+ "[%d] file_tags.lazy expected:\n%v, got:\n%v",
+ test_case_i, test_case.tags.lazy, tags.lazy)
+
+ testing.expectf(t, test_case.tags.no_instrumentation == tags.no_instrumentation,
+ "[%d] file_tags.no_instrumentation expected:\n%v, got:\n%v",
+ test_case_i, test_case.tags.no_instrumentation, tags.no_instrumentation)
+
+ for target in test_case.matching_targets {
+ matches := parser.match_build_tags(test_case.tags, target.target)
+ testing.expectf(t, matches == target.result,
+ "[%d] Expected parser.match_build_tags(%#v) == %v, got %v",
+ test_case_i, target.target, target.result, matches)
+ }
+ }
+}