diff --git a/tests/java.rs b/tests/java.rs index 1ac71d0..61bb125 100644 --- a/tests/java.rs +++ b/tests/java.rs @@ -70,3 +70,42 @@ fn runnables_nested_test() { "languages/java/runnables.scm", ); } + +// ============================================================================ +// Outline Tests +// ============================================================================ + +#[test] +fn outline() { + support::assert_query_snapshot( + "outline", + "tests/languages/java/org/example/Outline.java", + "languages/java/outline.scm", + ); +} + +// ============================================================================ +// Textobjects Tests +// ============================================================================ + +#[test] +fn textobjects() { + support::assert_query_snapshot( + "textobjects", + "tests/languages/java/org/example/TextObjects.java", + "languages/java/textobjects.scm", + ); +} + +// ============================================================================ +// Injections Tests +// ============================================================================ + +#[test] +fn injections() { + support::assert_query_snapshot( + "injections", + "tests/languages/java/org/example/Injections.java", + "languages/java/injections.scm", + ); +} diff --git a/tests/languages/java/org/example/Injections.java b/tests/languages/java/org/example/Injections.java new file mode 100644 index 0000000..899c217 --- /dev/null +++ b/tests/languages/java/org/example/Injections.java @@ -0,0 +1,14 @@ +package org.example; + +// This is a line comment injection content. +/* This is a block comment injection content. */ +/** + * This is a Javadoc comment matching doxygen-like rules. + */ +public class Injections { + public void test() { + System.out.printf("Printf format string: %s %d\n", "hello", 123); + String.format("Format string: %x", 255); + String formatted = "Formatted string literal: %s".formatted("example"); + } +} diff --git a/tests/languages/java/org/example/Outline.java b/tests/languages/java/org/example/Outline.java new file mode 100644 index 0000000..55e4166 --- /dev/null +++ b/tests/languages/java/org/example/Outline.java @@ -0,0 +1,56 @@ +package org.example; + +public class Outline { + public static final String CONSTANT_FIELD = "value"; + private String instanceField; + + static { + // static initializer block + System.out.println("Static Init"); + } + + public Outline() { + this.instanceField = "default"; + } + + public Outline(String value) { + this.instanceField = value; + } + + public String getInstanceField() { + return instanceField; + } + + public static void staticMethod() { + // static method + } + + private static class NestedClass { + private int nestedField; + } +} + +interface ExampleInterface { + int INTERFACE_CONSTANT = 42; + + void abstractMethod(); + + default void defaultMethod() { + // default method + } +} + +record ExampleRecord(String first, int second) { + public ExampleRecord { + // compact constructor + } +} + +enum ExampleEnum { + FIRST_CONSTANT, + SECOND_CONSTANT; +} + +@interface ExampleAnnotation { + String value() default "default_val"; +} diff --git a/tests/languages/java/org/example/TextObjects.java b/tests/languages/java/org/example/TextObjects.java new file mode 100644 index 0000000..4371e55 --- /dev/null +++ b/tests/languages/java/org/example/TextObjects.java @@ -0,0 +1,55 @@ +package org.example; + +// This is a block comment +// with multiple lines for testing +// comment.around +public class TextObjects { + /* + * This is a block comment in the class + */ + private String name; + + public TextObjects(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void runLambda() { + Runnable r1 = () -> { + System.out.println("Block lambda body"); + }; + + Runnable r2 = () -> System.out.println("Expression lambda body"); + } +} + +interface TestInterface { + void process(); + + default void log() { + System.out.println("Interface log"); + } +} + +enum TestEnum { + A, B, C; + + public void print() { + System.out.println(this.name()); + } +} + +record TestRecord(int value) { + public TestRecord { + if (value < 0) { + throw new IllegalArgumentException(); + } + } +} + +@interface TestAnnotation { + String value(); +} diff --git a/tests/languages/java/snapshots/injections.snap b/tests/languages/java/snapshots/injections.snap new file mode 100644 index 0000000..c3e955a --- /dev/null +++ b/tests/languages/java/snapshots/injections.snap @@ -0,0 +1,48 @@ +--- +source: tests/support/mod.rs +expression: captures +--- +- name: injection.content + line: 3 + column: 1 + text: // This is a line comment injection content. +- name: injection.content + line: 4 + column: 1 + text: /* This is a block comment injection content. */ +- name: injection.content + line: 4 + column: 1 + text: /* This is a block comment injection content. */ +- name: injection.content + line: 5 + column: 1 + text: "/**\n * This is a Javadoc comment matching doxygen-like rules.\n */" +- name: injection.content + line: 5 + column: 1 + text: "/**\n * This is a Javadoc comment matching doxygen-like rules.\n */" +- name: _method + line: 10 + column: 20 + text: printf +- name: injection.content + line: 10 + column: 28 + text: "Printf format string: %s %d" +- name: _method + line: 11 + column: 16 + text: format +- name: injection.content + line: 11 + column: 24 + text: "Format string: %x" +- name: injection.content + line: 12 + column: 29 + text: "Formatted string literal: %s" +- name: _method + line: 12 + column: 59 + text: formatted diff --git a/tests/languages/java/snapshots/outline.snap b/tests/languages/java/snapshots/outline.snap new file mode 100644 index 0000000..f165d36 --- /dev/null +++ b/tests/languages/java/snapshots/outline.snap @@ -0,0 +1,372 @@ +--- +source: tests/support/mod.rs +expression: captures +--- +- name: context + line: 3 + column: 1 + text: public +- name: context + line: 3 + column: 8 + text: class +- name: name + line: 3 + column: 14 + text: Outline +- name: item + line: 3 + column: 22 + text: "{\n public static final String CONSTANT_FIELD = \"value\";\n private String instanceField;\n\n static {\n // static initializer block\n System.out.println(\"Static Init\");\n }\n\n public Outline() {\n this.instanceField = \"default\";\n }\n\n public Outline(String value) {\n this.instanceField = value;\n }\n\n public String getInstanceField() {\n return instanceField;\n }\n\n public static void staticMethod() {\n // static method\n }\n\n private static class NestedClass {\n private int nestedField;\n }\n}" +- name: item + line: 4 + column: 5 + text: "public static final String CONSTANT_FIELD = \"value\";" +- name: context + line: 4 + column: 5 + text: public +- name: context + line: 4 + column: 12 + text: static +- name: context + line: 4 + column: 19 + text: final +- name: context + line: 4 + column: 25 + text: String +- name: name + line: 4 + column: 32 + text: CONSTANT_FIELD +- name: item + line: 5 + column: 5 + text: private String instanceField; +- name: context + line: 5 + column: 5 + text: private +- name: context + line: 5 + column: 13 + text: String +- name: name + line: 5 + column: 20 + text: instanceField +- name: context + line: 7 + column: 5 + text: static +- name: item + line: 7 + column: 12 + text: "{\n // static initializer block\n System.out.println(\"Static Init\");\n }" +- name: context + line: 12 + column: 5 + text: public +- name: name + line: 12 + column: 12 + text: Outline +- name: context + line: 12 + column: 19 + text: ( +- name: context + line: 12 + column: 20 + text: ) +- name: item + line: 12 + column: 22 + text: "{\n this.instanceField = \"default\";\n }" +- name: context + line: 16 + column: 5 + text: public +- name: name + line: 16 + column: 12 + text: Outline +- name: context + line: 16 + column: 19 + text: ( +- name: context + line: 16 + column: 20 + text: String +- name: context + line: 16 + column: 32 + text: ) +- name: item + line: 16 + column: 34 + text: "{\n this.instanceField = value;\n }" +- name: context + line: 20 + column: 5 + text: public +- name: context + line: 20 + column: 12 + text: String +- name: name + line: 20 + column: 19 + text: getInstanceField +- name: context + line: 20 + column: 35 + text: ( +- name: context + line: 20 + column: 36 + text: ) +- name: item + line: 20 + column: 38 + text: "{\n return instanceField;\n }" +- name: context + line: 24 + column: 5 + text: public +- name: context + line: 24 + column: 12 + text: static +- name: context + line: 24 + column: 19 + text: void +- name: name + line: 24 + column: 24 + text: staticMethod +- name: context + line: 24 + column: 36 + text: ( +- name: context + line: 24 + column: 37 + text: ) +- name: item + line: 24 + column: 39 + text: "{\n // static method\n }" +- name: context + line: 28 + column: 5 + text: private +- name: context + line: 28 + column: 13 + text: static +- name: context + line: 28 + column: 20 + text: class +- name: name + line: 28 + column: 26 + text: NestedClass +- name: item + line: 28 + column: 38 + text: "{\n private int nestedField;\n }" +- name: item + line: 29 + column: 9 + text: private int nestedField; +- name: context + line: 29 + column: 9 + text: private +- name: context + line: 29 + column: 17 + text: int +- name: name + line: 29 + column: 21 + text: nestedField +- name: context + line: 33 + column: 1 + text: interface +- name: name + line: 33 + column: 11 + text: ExampleInterface +- name: item + line: 33 + column: 28 + text: "{\n int INTERFACE_CONSTANT = 42;\n\n void abstractMethod();\n\n default void defaultMethod() {\n // default method\n }\n}" +- name: item + line: 34 + column: 5 + text: int INTERFACE_CONSTANT = 42; +- name: context + line: 34 + column: 5 + text: int +- name: name + line: 34 + column: 9 + text: INTERFACE_CONSTANT +- name: context + line: 36 + column: 5 + text: void +- name: name + line: 36 + column: 10 + text: abstractMethod +- name: context + line: 36 + column: 24 + text: ( +- name: context + line: 36 + column: 25 + text: ) +- name: item + line: 36 + column: 26 + text: ; +- name: context + line: 38 + column: 13 + text: void +- name: name + line: 38 + column: 18 + text: defaultMethod +- name: context + line: 38 + column: 31 + text: ( +- name: context + line: 38 + column: 32 + text: ) +- name: item + line: 38 + column: 34 + text: "{\n // default method\n }" +- name: item + line: 43 + column: 22 + text: String first +- name: context + line: 43 + column: 22 + text: String +- name: name + line: 43 + column: 29 + text: first +- name: item + line: 43 + column: 36 + text: int second +- name: context + line: 43 + column: 36 + text: int +- name: name + line: 43 + column: 40 + text: second +- name: context + line: 43 + column: 1 + text: record +- name: name + line: 43 + column: 8 + text: ExampleRecord +- name: item + line: 43 + column: 48 + text: "{\n public ExampleRecord {\n // compact constructor\n }\n}" +- name: context + line: 44 + column: 5 + text: public +- name: name + line: 44 + column: 12 + text: ExampleRecord +- name: item + line: 44 + column: 26 + text: "{\n // compact constructor\n }" +- name: context + line: 49 + column: 1 + text: enum +- name: name + line: 49 + column: 6 + text: ExampleEnum +- name: item + line: 49 + column: 18 + text: "{\n FIRST_CONSTANT,\n SECOND_CONSTANT;\n}" +- name: item + line: 50 + column: 5 + text: FIRST_CONSTANT +- name: name + line: 50 + column: 5 + text: FIRST_CONSTANT +- name: item + line: 51 + column: 5 + text: SECOND_CONSTANT +- name: name + line: 51 + column: 5 + text: SECOND_CONSTANT +- name: context + line: 54 + column: 1 + text: "@interface" +- name: name + line: 54 + column: 12 + text: ExampleAnnotation +- name: item + line: 54 + column: 30 + text: "{\n String value() default \"default_val\";\n}" +- name: item + line: 55 + column: 5 + text: "String value() default \"default_val\";" +- name: context + line: 55 + column: 5 + text: String +- name: name + line: 55 + column: 12 + text: value +- name: context + line: 55 + column: 17 + text: ( +- name: context + line: 55 + column: 18 + text: ) diff --git a/tests/languages/java/snapshots/textobjects.snap b/tests/languages/java/snapshots/textobjects.snap new file mode 100644 index 0000000..ac62701 --- /dev/null +++ b/tests/languages/java/snapshots/textobjects.snap @@ -0,0 +1,168 @@ +--- +source: tests/support/mod.rs +expression: captures +--- +- name: class.around + line: 6 + column: 1 + text: "public class TextObjects {\n /*\n * This is a block comment in the class\n */\n private String name;\n\n public TextObjects(String name) {\n this.name = name;\n }\n\n public String getName() {\n return name;\n }\n\n public void runLambda() {\n Runnable r1 = () -> {\n System.out.println(\"Block lambda body\");\n };\n\n Runnable r2 = () -> System.out.println(\"Expression lambda body\");\n }\n}" +- name: comment.around + line: 3 + column: 1 + text: // This is a block comment +- name: comment.around + line: 4 + column: 1 + text: // with multiple lines for testing +- name: comment.around + line: 5 + column: 1 + text: // comment.around +- name: comment.around + line: 7 + column: 5 + text: "/*\n * This is a block comment in the class\n */" +- name: function.around + line: 12 + column: 5 + text: "public TextObjects(String name) {\n this.name = name;\n }" +- name: function.inside + line: 13 + column: 9 + text: this.name = name; +- name: function.around + line: 16 + column: 5 + text: "public String getName() {\n return name;\n }" +- name: function.inside + line: 17 + column: 9 + text: return name; +- name: function.around + line: 20 + column: 5 + text: "public void runLambda() {\n Runnable r1 = () -> {\n System.out.println(\"Block lambda body\");\n };\n\n Runnable r2 = () -> System.out.println(\"Expression lambda body\");\n }" +- name: function.around + line: 21 + column: 23 + text: "() -> {\n System.out.println(\"Block lambda body\");\n }" +- name: function.inside + line: 21 + column: 29 + text: "{\n System.out.println(\"Block lambda body\");\n }" +- name: function.inside + line: 22 + column: 13 + text: "System.out.println(\"Block lambda body\");" +- name: function.around + line: 25 + column: 23 + text: "() -> System.out.println(\"Expression lambda body\")" +- name: function.inside + line: 25 + column: 29 + text: "System.out.println(\"Expression lambda body\")" +- name: function.inside + line: 21 + column: 9 + text: "Runnable r1 = () -> {\n System.out.println(\"Block lambda body\");\n };" +- name: function.inside + line: 25 + column: 9 + text: "Runnable r2 = () -> System.out.println(\"Expression lambda body\");" +- name: class.inside + line: 7 + column: 5 + text: "/*\n * This is a block comment in the class\n */" +- name: class.inside + line: 10 + column: 5 + text: private String name; +- name: class.inside + line: 12 + column: 5 + text: "public TextObjects(String name) {\n this.name = name;\n }" +- name: class.inside + line: 16 + column: 5 + text: "public String getName() {\n return name;\n }" +- name: class.inside + line: 20 + column: 5 + text: "public void runLambda() {\n Runnable r1 = () -> {\n System.out.println(\"Block lambda body\");\n };\n\n Runnable r2 = () -> System.out.println(\"Expression lambda body\");\n }" +- name: class.around + line: 29 + column: 1 + text: "interface TestInterface {\n void process();\n\n default void log() {\n System.out.println(\"Interface log\");\n }\n}" +- name: function.around + line: 30 + column: 5 + text: void process(); +- name: function.around + line: 32 + column: 5 + text: "default void log() {\n System.out.println(\"Interface log\");\n }" +- name: function.inside + line: 33 + column: 9 + text: "System.out.println(\"Interface log\");" +- name: class.inside + line: 30 + column: 5 + text: void process(); +- name: class.inside + line: 32 + column: 5 + text: "default void log() {\n System.out.println(\"Interface log\");\n }" +- name: class.around + line: 37 + column: 1 + text: "enum TestEnum {\n A, B, C;\n\n public void print() {\n System.out.println(this.name());\n }\n}" +- name: function.around + line: 40 + column: 5 + text: "public void print() {\n System.out.println(this.name());\n }" +- name: function.inside + line: 41 + column: 9 + text: System.out.println(this.name()); +- name: class.inside + line: 38 + column: 5 + text: A +- name: class.inside + line: 38 + column: 6 + text: "," +- name: class.inside + line: 38 + column: 8 + text: B +- name: class.inside + line: 38 + column: 9 + text: "," +- name: class.inside + line: 38 + column: 11 + text: C +- name: class.inside + line: 38 + column: 12 + text: ";\n\n public void print() {\n System.out.println(this.name());\n }" +- name: class.around + line: 45 + column: 1 + text: "record TestRecord(int value) {\n public TestRecord {\n if (value < 0) {\n throw new IllegalArgumentException();\n }\n }\n}" +- name: class.inside + line: 46 + column: 5 + text: "public TestRecord {\n if (value < 0) {\n throw new IllegalArgumentException();\n }\n }" +- name: class.around + line: 53 + column: 1 + text: "@interface TestAnnotation {\n String value();\n}" +- name: class.inside + line: 54 + column: 5 + text: String value();