From 629395fd5842b302f160c40386bbe60194352bca Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Wed, 13 Mar 2024 14:31:02 +0200 Subject: [PATCH] feat(bindings): add node, python, swift tests --- cli/src/generate/grammar_files.rs | 39 ++++++++++++-- cli/src/generate/templates/Package.swift | 47 ----------------- cli/src/generate/templates/binding_test.js | 9 ++++ cli/src/generate/templates/gitignore | 1 + cli/src/generate/templates/package.swift | 60 ++++++++++++++++++++++ cli/src/generate/templates/test_binding.py | 11 ++++ cli/src/generate/templates/tests.swift | 12 +++++ 7 files changed, 129 insertions(+), 50 deletions(-) delete mode 100644 cli/src/generate/templates/Package.swift create mode 100644 cli/src/generate/templates/binding_test.js create mode 100644 cli/src/generate/templates/package.swift create mode 100644 cli/src/generate/templates/test_binding.py create mode 100644 cli/src/generate/templates/tests.swift diff --git a/cli/src/generate/grammar_files.rs b/cli/src/generate/grammar_files.rs index 6ad9cdcc..a8838f2a 100644 --- a/cli/src/generate/grammar_files.rs +++ b/cli/src/generate/grammar_files.rs @@ -39,6 +39,7 @@ const INDEX_JS_TEMPLATE: &str = include_str!("./templates/index.js"); const INDEX_D_TS_TEMPLATE: &str = include_str!("./templates/index.d.ts"); const JS_BINDING_CC_TEMPLATE: &str = include_str!("./templates/js-binding.cc"); const BINDING_GYP_TEMPLATE: &str = include_str!("./templates/binding.gyp"); +const BINDING_TEST_JS_TEMPLATE: &str = include_str!("./templates/binding_test.js"); const MAKEFILE_TEMPLATE: &str = include_str!("./templates/makefile"); const PARSER_NAME_H_TEMPLATE: &str = include_str!("./templates/PARSER_NAME.h"); @@ -46,15 +47,17 @@ const PARSER_NAME_PC_IN_TEMPLATE: &str = include_str!("./templates/PARSER_NAME.p const GO_MOD_TEMPLATE: &str = include_str!("./templates/go.mod"); const BINDING_GO_TEMPLATE: &str = include_str!("./templates/binding.go"); -const BINDING_GO_TEST_TEMPLATE: &str = include_str!("./templates/binding_test.go"); +const BINDING_TEST_GO_TEMPLATE: &str = include_str!("./templates/binding_test.go"); const SETUP_PY_TEMPLATE: &str = include_str!("./templates/setup.py"); const INIT_PY_TEMPLATE: &str = include_str!("./templates/__init__.py"); const INIT_PYI_TEMPLATE: &str = include_str!("./templates/__init__.pyi"); const PYPROJECT_TOML_TEMPLATE: &str = include_str!("./templates/pyproject.toml"); const PY_BINDING_C_TEMPLATE: &str = include_str!("./templates/py-binding.c"); +const TEST_BINDING_PY_TEMPLATE: &str = include_str!("./templates/test_binding.py"); -const PACKAGE_SWIFT_TEMPLATE: &str = include_str!("./templates/Package.swift"); +const PACKAGE_SWIFT_TEMPLATE: &str = include_str!("./templates/package.swift"); +const TESTS_SWIFT_TEMPLATE: &str = include_str!("./templates/tests.swift"); #[derive(Deserialize, Debug)] struct LanguageConfiguration {} @@ -339,6 +342,10 @@ pub fn generate_grammar_files( generate_file(path, INDEX_D_TS_TEMPLATE, language_name) })?; + missing_path(path.join("binding_test.js"), |path| { + generate_file(path, BINDING_TEST_JS_TEMPLATE, language_name) + })?; + missing_path_else( path.join("binding.cc"), |path| generate_file(path, JS_BINDING_CC_TEMPLATE, language_name), @@ -397,7 +404,7 @@ pub fn generate_grammar_files( })?; missing_path(path.join("binding_test.go"), |path| { - generate_file(path, BINDING_GO_TEST_TEMPLATE, language_name) + generate_file(path, BINDING_TEST_GO_TEMPLATE, language_name) })?; missing_path(path.join("go.mod"), |path| { @@ -428,6 +435,13 @@ pub fn generate_grammar_files( generate_file(path, "", language_name) // py.typed is empty })?; + missing_path(path.join("tests"), create_dir)?.apply(|path| { + missing_path(path.join("test_binding.py"), |path| { + generate_file(path, TEST_BINDING_PY_TEMPLATE, language_name) + })?; + Ok(()) + })?; + missing_path(repo_path.join("setup.py"), |path| { generate_file(path, SETUP_PY_TEMPLATE, language_name) })?; @@ -448,6 +462,25 @@ pub fn generate_grammar_files( generate_file(path, PARSER_NAME_H_TEMPLATE, language_name) })?; + missing_path( + path.join(format!( + "TreeSitter{}Tests", + language_name.to_upper_camel_case() + )), + create_dir, + )? + .apply(|path| { + missing_path( + path.join(format!( + "TreeSitter{}Tests.swift", + language_name.to_upper_camel_case() + )), + |path| generate_file(path, TESTS_SWIFT_TEMPLATE, language_name), + )?; + + Ok(()) + })?; + missing_path(repo_path.join("Package.swift"), |path| { generate_file(path, PACKAGE_SWIFT_TEMPLATE, language_name) })?; diff --git a/cli/src/generate/templates/Package.swift b/cli/src/generate/templates/Package.swift deleted file mode 100644 index dfa0c968..00000000 --- a/cli/src/generate/templates/Package.swift +++ /dev/null @@ -1,47 +0,0 @@ -// swift-tools-version:5.3 -import PackageDescription - -let package = Package( - name: "TreeSitterCAMEL_PARSER_NAME", - products: [ - .library(name: "TreeSitterCAMEL_PARSER_NAME", targets: ["TreeSitterCAMEL_PARSER_NAME"]), - ], - dependencies: [], - targets: [ - .target(name: "TreeSitterCAMEL_PARSER_NAME", - path: ".", - exclude: [ - "Cargo.toml", - "Makefile", - "binding.gyp", - "bindings/c", - "bindings/go", - "bindings/node", - "bindings/python", - "bindings/rust", - "prebuilds", - "grammar.js", - "package.json", - "package-lock.json", - "pyproject.toml", - "setup.py", - "test", - "examples", - ".editorconfig", - ".github", - ".gitignore", - ".gitattributes", - ".gitmodules", - ], - sources: [ - "src/parser.c", - // NOTE: if your language has an external scanner, add it here. - ], - resources: [ - .copy("queries") - ], - publicHeadersPath: "bindings/swift", - cSettings: [.headerSearchPath("src")]) - ], - cLanguageStandard: .c11 -) diff --git a/cli/src/generate/templates/binding_test.js b/cli/src/generate/templates/binding_test.js new file mode 100644 index 00000000..afede30a --- /dev/null +++ b/cli/src/generate/templates/binding_test.js @@ -0,0 +1,9 @@ +/// + +const assert = require("node:assert"); +const { test } = require("node:test"); + +test("can load grammar", () => { + const parser = new (require("tree-sitter"))(); + assert.doesNotThrow(() => parser.setLanguage(require("."))); +}); diff --git a/cli/src/generate/templates/gitignore b/cli/src/generate/templates/gitignore index 27fc43f7..dd5cc848 100644 --- a/cli/src/generate/templates/gitignore +++ b/cli/src/generate/templates/gitignore @@ -10,6 +10,7 @@ node_modules/ # Swift artifacts .build/ +Package.resolved # Go artifacts go.sum diff --git a/cli/src/generate/templates/package.swift b/cli/src/generate/templates/package.swift new file mode 100644 index 00000000..c1be93db --- /dev/null +++ b/cli/src/generate/templates/package.swift @@ -0,0 +1,60 @@ +// swift-tools-version:5.3 +import PackageDescription + +let package = Package( + name: "TreeSitterCAMEL_PARSER_NAME", + products: [ + .library(name: "TreeSitterCAMEL_PARSER_NAME", targets: ["TreeSitterCAMEL_PARSER_NAME"]), + ], + dependencies: [ + .package(url: "https://github.com/ChimeHQ/SwiftTreeSitter", from: "0.8.0"), + ], + targets: [ + .target( + name: "TreeSitterCAMEL_PARSER_NAME", + dependencies: [], + path: ".", + exclude: [ + "Cargo.toml", + "Makefile", + "binding.gyp", + "bindings/c", + "bindings/go", + "bindings/node", + "bindings/python", + "bindings/rust", + "prebuilds", + "grammar.js", + "package.json", + "package-lock.json", + "pyproject.toml", + "setup.py", + "test", + "examples", + ".editorconfig", + ".github", + ".gitignore", + ".gitattributes", + ".gitmodules", + ], + sources: [ + "src/parser.c", + // NOTE: if your language has an external scanner, add it here. + ], + resources: [ + .copy("queries") + ], + publicHeadersPath: "bindings/swift", + cSettings: [.headerSearchPath("src")] + ), + .testTarget( + name: "TreeSitterCAMEL_PARSER_NAMETests", + dependencies: [ + "SwiftTreeSitter", + "TreeSitterCAMEL_PARSER_NAME", + ], + path: "bindings/swift/TreeSitterCAMEL_PARSER_NAMETests" + ) + ], + cLanguageStandard: .c11 +) diff --git a/cli/src/generate/templates/test_binding.py b/cli/src/generate/templates/test_binding.py new file mode 100644 index 00000000..6be6cf4b --- /dev/null +++ b/cli/src/generate/templates/test_binding.py @@ -0,0 +1,11 @@ +from unittest import TestCase + +import tree_sitter, tree_sitter_LOWER_PARSER_NAME + + +class TestLanguage(TestCase): + def test_can_load_grammar(self): + try: + tree_sitter.Language(tree_sitter_LOWER_PARSER_NAME.language()) + except Exception: + self.fail("Error loading CAMEL_PARSER_NAME grammar") diff --git a/cli/src/generate/templates/tests.swift b/cli/src/generate/templates/tests.swift new file mode 100644 index 00000000..3d0b8ce0 --- /dev/null +++ b/cli/src/generate/templates/tests.swift @@ -0,0 +1,12 @@ +import XCTest +import SwiftTreeSitter +import TreeSitterCAMEL_PARSER_NAME + +final class TreeSitterCAMEL_PARSER_NAMETests: XCTestCase { + func testCanLoadGrammar() throws { + let parser = Parser() + let language = Language(language: tree_sitter_LOWER_PARSER_NAME()) + XCTAssertNoThrow(try parser.setLanguage(language), + "Error loading CAMEL_PARSER_NAME grammar") + } +}