refactor(tests): Inline all language-specific parse methods #530

Merged
wetneb merged 3 commits from wetneb/remove_lang_specific_parse_methods into main 2025-07-24 15:17:19 +02:00 AGit

View file

@ -1052,25 +1052,25 @@ mod tests {
fn heights() {
let ctx = ctx();
assert_eq!(ctx.parse_json("null").height(), 1);
assert_eq!(ctx.parse_json("[1]").height(), 2);
assert_eq!(ctx.parse_json("{\"foo\": 3}").height(), 4);
assert_eq!(ctx.parse("a.json", "null").height(), 1);
assert_eq!(ctx.parse("a.json", "[1]").height(), 2);
assert_eq!(ctx.parse("a.json", "{\"foo\": 3}").height(), 4);
}
#[test]
fn sizes() {
let ctx = ctx();
assert_eq!(ctx.parse_json("null").size(), 2);
assert_eq!(ctx.parse_json("[1]").size(), 5);
assert_eq!(ctx.parse_json("{\"foo\": 3}").size(), 11);
assert_eq!(ctx.parse("a.json", "null").size(), 2);
assert_eq!(ctx.parse("a.json", "[1]").size(), 5);
assert_eq!(ctx.parse("a.json", "{\"foo\": 3}").size(), 11);
}
#[test]
fn children_by_field_names() {
let ctx = ctx();
let root = ctx.parse_json("{\"foo\": 3}");
let root = ctx.parse("a.json", "{\"foo\": 3}");
let object = root[0];
let pair = object[1];
assert_eq!(root.children_by_field_name("non_existent"), None);
@ -1084,7 +1084,7 @@ mod tests {
fn children_by_field_names_with_modifiers() {
let ctx = ctx();
let root = ctx.parse_java("public class MyCls {}");
let root = ctx.parse("a.java", "public class MyCls {}");
let class_declaration = root[0];
assert_eq!(
class_declaration.children_by_field_name("name"),
@ -1096,7 +1096,7 @@ mod tests {
fn atomic_nodes() {
let ctx = ctx();
let root = ctx.parse_java("import java.io.InputStream;");
let root = ctx.parse("a.java", "import java.io.InputStream;");
let import_statement = root[0];
assert_eq!(import_statement.children.len(), 0);
}
@ -1104,7 +1104,7 @@ mod tests {
#[test]
fn trailing_newlines_are_stripped_from_nodes() {
let ctx = ctx();
let tree = ctx.parse_rust(" /// test\n fn foo() {\n ()\n }\n");
let tree = ctx.parse("a.rs", " /// test\n fn foo() {\n ()\n }\n");
let comment = tree[0][0][0];
assert_eq!(comment.grammar_name, "line_outer_doc_comment");
// tree-sitter-rust includes a newline at the end of the source for this node,
@ -1116,16 +1116,16 @@ mod tests {
fn hashing_does_not_depend_on_whitespace_but_on_content() {
let ctx = ctx();
let hash_1 = &ctx.parse_rust("fn x() -> i32 { 7 - 1 }").hash;
let hash_2 = &ctx.parse_rust("fn x() -> i32 {\n 7-1 }").hash;
let hash_3 = &ctx.parse_rust("fn x() -> i32 {\n 9-2 }").hash;
let hash_1 = &ctx.parse("a.rs", "fn x() -> i32 { 7 - 1 }").hash;
let hash_2 = &ctx.parse("a.rs", "fn x() -> i32 {\n 7-1 }").hash;
let hash_3 = &ctx.parse("a.rs", "fn x() -> i32 {\n 9-2 }").hash;
assert_eq!(hash_1, hash_2); // whitespace and indentation differences are insignificant
assert_ne!(hash_2, hash_3);
let hash_4 = &ctx.parse_rust("fn x() { \"some string\" }").hash;
let hash_5 = &ctx.parse_rust("fn x() { \" some string\" }").hash;
let hash_6 = &ctx.parse_rust("fn x() { \"some string\" }").hash;
let hash_4 = &ctx.parse("a.rs", "fn x() { \"some string\" }").hash;
let hash_5 = &ctx.parse("a.rs", "fn x() { \" some string\" }").hash;
let hash_6 = &ctx.parse("a.rs", "fn x() { \"some string\" }").hash;
assert_ne!(hash_4, hash_5); // whitespace inside of a string is significant
assert_eq!(hash_4, hash_6);
}
@ -1134,8 +1134,8 @@ mod tests {
fn isomorphism_is_not_just_hashing() {
let ctx = ctx();
let node_1 = ctx.parse_rust("fn x() -> i32 { 7 - 1 }");
let node_2 = ctx.parse_rust("fn x() -> i32 { 8 - 1 }");
let node_1 = ctx.parse("a.rs", "fn x() -> i32 { 7 - 1 }");
let node_2 = ctx.parse("a.rs", "fn x() -> i32 { 8 - 1 }");
let fake_hash_collision = AstNode {
hash: node_1.hash,
parent: UnsafeCell::new(None),
@ -1154,8 +1154,8 @@ mod tests {
#[test]
fn isomorphism_of_empty_roots() {
let ctx = ctx();
let tree_1 = ctx.parse_rust(" ");
let tree_2 = ctx.parse_rust(" ");
let tree_1 = ctx.parse("a.rs", " ");
let tree_2 = ctx.parse("a.rs", " ");
assert!(tree_1.isomorphic_to(tree_2));
assert!(tree_2.isomorphic_to(tree_1));
}
@ -1164,8 +1164,8 @@ mod tests {
fn isomorphism_for_different_languages() {
let ctx = ctx();
let tree_python = ctx.parse_python("foo()");
let tree_java = ctx.parse_java("foo();");
let tree_python = ctx.parse("a.py", "foo()");
let tree_java = ctx.parse("a.java", "foo();");
let arguments_python = tree_python[0][0][1];
let arguments_java = tree_java[0][0][1];
@ -1184,7 +1184,7 @@ mod tests {
#[test]
fn parents_are_accessible() {
let ctx = ctx();
let tree = ctx.parse_json("{\"foo\": 3}");
let tree = ctx.parse("a.json", "{\"foo\": 3}");
let root = tree;
let first_child = root.child(0).expect("AST node is missing a child");
let second_child = first_child
@ -1199,7 +1199,7 @@ mod tests {
#[test]
fn dfs_traversal() {
let ctx = ctx();
let tree = ctx.parse_json("{\"foo\": 3}");
let tree = ctx.parse("a.json", "{\"foo\": 3}");
let node_types = tree.dfs().map(|n| n.grammar_name).collect_vec();
@ -1224,7 +1224,7 @@ mod tests {
#[test]
fn dfs_exact_size_iterator() {
let ctx = ctx();
let tree = ctx.parse_json("{\"foo\": 3}");
let tree = ctx.parse("a.json", "{\"foo\": 3}");
// using the cached version
let mut nodes = tree.dfs();
@ -1246,7 +1246,7 @@ mod tests {
#[test]
fn postfix_traversal() {
let ctx = ctx();
let tree = ctx.parse_json("{\"foo\": 3}");
let tree = ctx.parse("a.json", "{\"foo\": 3}");
let node_types = tree.postfix().map(|n| n.grammar_name).collect_vec();
@ -1271,7 +1271,7 @@ mod tests {
#[test]
fn truncate() {
let ctx = ctx();
let tree = ctx.parse_json("{\"foo\": 3, \"bar\": 4}");
let tree = ctx.parse("a.json", "{\"foo\": 3, \"bar\": 4}");
let arena = Arena::new();
let truncated = tree.truncate(|node| node.grammar_name == "pair", &arena);
@ -1295,7 +1295,7 @@ mod tests {
#[test]
fn leading_source() {
let ctx = ctx();
let tree = ctx.parse_rust("\n let x = 1;\n");
let tree = ctx.parse("a.rs", "\n let x = 1;\n");
assert_eq!(tree.byte_range.start, 0);
assert_eq!(tree.leading_source(), Some("\n "));
}
@ -1303,7 +1303,7 @@ mod tests {
#[test]
fn preceding_whitespace() {
let ctx = ctx();
let tree = ctx.parse_json("[1, 2,\n 3]");
let tree = ctx.parse("a.json", "[1, 2,\n 3]");
let root = tree[0];
let [bracket, one, comma, two, _, three] = root[0..=5] else {
@ -1321,7 +1321,7 @@ mod tests {
#[test]
fn preceding_whitespace_go() {
let ctx = ctx();
let tree = ctx.parse_go("import (\n \"fmt\"\n \"core\"\n)\n");
let tree = ctx.parse("a.go", "import (\n \"fmt\"\n \"core\"\n)\n");
let root = tree[0];
let import_list = root[1];
let core = import_list[2];
@ -1333,7 +1333,7 @@ mod tests {
#[test]
fn trailing_whitespace_toml() {
let ctx = ctx();
let tree = ctx.parse_toml("[foo]\na = 1\n\n[bar]\nb = 2");
let tree = ctx.parse("a.toml", "[foo]\na = 1\n\n[bar]\nb = 2");
let first_table = tree[0];
let second_table = tree[1];
assert_eq!(first_table.source, "[foo]\na = 1");
@ -1345,7 +1345,7 @@ mod tests {
#[test]
fn preceding_indentation_shift() {
let ctx = ctx();
let tree = ctx.parse_java("\nclass MyCls {\n int attr;\n}");
let tree = ctx.parse("a.java", "\nclass MyCls {\n int attr;\n}");
let class_decl = tree[0];
let class_body = class_decl[2];
let attr = class_body[1];
@ -1356,7 +1356,10 @@ mod tests {
#[test]
fn preceding_indentation_shift_tabs() {
let ctx = ctx();
let tree = ctx.parse_java("class Outer {\n\tclass MyCls {\n\t\tint attr;\n\t}\n}\n");
let tree = ctx.parse(
"a.java",
"class Outer {\n\tclass MyCls {\n\t\tint attr;\n\t}\n}\n",
);
let class_decl = tree[0][2][1];
let class_body = class_decl[2];
let attr = class_body[1];
@ -1367,7 +1370,10 @@ mod tests {
#[test]
fn preceding_indentation_shift_mixed_spaces_and_tabs() {
let ctx = ctx();
let tree = ctx.parse_java("class Outer {\n\tclass MyCls {\n int attr;\n\t}\n}\n");
let tree = ctx.parse(
"a.java",
"class Outer {\n\tclass MyCls {\n int attr;\n\t}\n}\n",
);
let class_decl = tree[0][2][1];
let class_body = class_decl[2];
let attr = class_body[1];
@ -1378,7 +1384,10 @@ mod tests {
#[test]
fn preceding_indentation_shift_mixed_tabs_and_spaces() {
let ctx = ctx();
let tree = ctx.parse_java("class Outer {\n class MyCls {\n\t\tint attr;\n }\n}\n");
let tree = ctx.parse(
"a.java",
"class Outer {\n class MyCls {\n\t\tint attr;\n }\n}\n",
);
let class_decl = tree[0][2][1];
let class_body = class_decl[2];
let attr = class_body[1];
@ -1389,7 +1398,7 @@ mod tests {
#[test]
fn reindent_yaml() {
let ctx = ctx();
let tree = ctx.parse_yaml("hello:\n foo: 2\nbar: 4\n");
let tree = ctx.parse("a.yaml", "hello:\n foo: 2\nbar: 4\n");
let block_node = tree[0][0];
assert_eq!(block_node.grammar_name, "block_node");
let value = block_node[0][0][2];
@ -1402,7 +1411,7 @@ mod tests {
#[test]
fn source_with_whitespace() {
let ctx = ctx();
let tree = ctx.parse_json(" [ 1 , 2,\n 3]");
let tree = ctx.parse("a.json", " [ 1 , 2,\n 3]");
let root = tree[0];
let [bracket, one, comma, two, comma_2] = root[0..=4] else {
@ -1420,7 +1429,8 @@ mod tests {
fn removing_indentation() {
let ctx = ctx();
let tree = ctx.parse_json(
let tree = ctx.parse(
"a.json",
r#"
{
"a": [
@ -1458,10 +1468,14 @@ mod tests {
fn multiline_comments_are_isomorphic() {
let ctx = ctx();
let comment_1 =
ctx.parse_java("/**\n * This is a comment\n * spanning on many lines\n*/")[0];
let comment_2 =
ctx.parse_java(" /**\n * This is a comment\n * spanning on many lines\n */")[0];
let comment_1 = ctx.parse(
"a.java",
"/**\n * This is a comment\n * spanning on many lines\n*/",
)[0];
let comment_2 = ctx.parse(
"a.java",
" /**\n * This is a comment\n * spanning on many lines\n */",
)[0];
assert!(comment_1.isomorphic_to(comment_2));
assert_eq!(comment_1.children.len(), 4);
@ -1497,7 +1511,7 @@ mod tests {
#[test]
fn print_as_ascii_art() {
let ctx = ctx();
let tree = ctx.parse_json("{\"foo\": 3, \"bar\": 4}");
let tree = ctx.parse("a.json", "{\"foo\": 3, \"bar\": 4}");
let ascii_tree = tree.ascii_tree();
@ -1529,12 +1543,12 @@ mod tests {
#[test]
fn commutative_isomorphism() {
let ctx = ctx();
let obj_1 = ctx.parse_json("{\"foo\": 3, \"bar\": 4}");
let obj_2 = ctx.parse_json("{\"bar\": 4, \"foo\": 3}");
let obj_3 = ctx.parse_json("{\"bar\": 3, \"foo\": 4}");
let obj_4 = ctx.parse_json("{\n \"foo\": 3,\n \"bar\": 4\n}");
let array_1 = ctx.parse_json("[ 1, 2 ]");
let array_2 = ctx.parse_json("[ 2, 1 ]");
let obj_1 = ctx.parse("a.json", "{\"foo\": 3, \"bar\": 4}");
let obj_2 = ctx.parse("a.json", "{\"bar\": 4, \"foo\": 3}");
let obj_3 = ctx.parse("a.json", "{\"bar\": 3, \"foo\": 4}");
let obj_4 = ctx.parse("a.json", "{\n \"foo\": 3,\n \"bar\": 4\n}");
let array_1 = ctx.parse("a.json", "[ 1, 2 ]");
let array_2 = ctx.parse("a.json", "[ 2, 1 ]");
assert!(obj_1.commutatively_isomorphic_to(obj_2));
assert!(!obj_1.commutatively_isomorphic_to(obj_3));
@ -1543,8 +1557,8 @@ mod tests {
assert!(!obj_1.commutatively_isomorphic_to(array_1));
assert!(!array_1.commutatively_isomorphic_to(array_2));
let method1 = ctx.parse_java("public final void main();");
let method2 = ctx.parse_java("public final static void main();");
let method1 = ctx.parse("a.java", "public final void main();");
let method2 = ctx.parse("a.java", "public final static void main();");
// `public`, `final` and `static` are all commutative children of (function) `modifiers`,
// but the second tree doesn't have `static`. A naive `zip` would only check the first two
@ -1560,7 +1574,7 @@ mod tests {
let src = r#"let foo = "line 1
line 2
line 3";"#;
let tree = ctx.parse_rust(src);
let tree = ctx.parse("a.rs", src);
let root = tree;
assert_eq!(root.id, 13);
@ -1602,7 +1616,7 @@ line 3";"#;
let src = r#"let foo = "line 1
line 2
line 3";"#;
let tree = ctx.parse_rust(src);
let tree = ctx.parse("a.rs", src);
let ids = tree.dfs().map(|n| n.id).collect_vec();
@ -1616,7 +1630,10 @@ line 3";"#;
#[test]
fn parse_html_with_js() {
let ctx = ctx();
let html = ctx.parse_html("<html><head><script>console.log('hi');</script></head></html>");
let html = ctx.parse(
"a.html",
"<html><head><script>console.log('hi');</script></head></html>",
);
assert_eq!(html.grammar_name, "document");
assert_eq!(html.lang_profile.name, "HTML");
@ -1633,7 +1650,10 @@ line 3";"#;
#[test]
fn parse_injection_with_syntax_error() {
let ctx = ctx();
let html = ctx.parse_html("<html><head><script>invalid(][)</script></head></html>");
let html = ctx.parse(
"a.html",
"<html><head><script>invalid(][)</script></head></html>",
);
assert_eq!(html.grammar_name, "document");
assert_eq!(html.lang_profile.name, "HTML");
@ -1659,7 +1679,7 @@ A list:
- Hello
"#;
let markdown = ctx.parse_markdown(source);
let markdown = ctx.parse("a.md", source);
let paragraph = markdown[0][1][0][1];
assert_eq!(paragraph.grammar_name, "paragraph");
@ -1672,7 +1692,7 @@ A list:
#[test]
fn commutative_parent_via_query() {
let ctx = ctx();
let python = ctx.parse_python("__all__ = [ 'foo', 'bar' ]\nother = [ 1, 2 ]\n");
let python = ctx.parse("a.py", "__all__ = [ 'foo', 'bar' ]\nother = [ 1, 2 ]\n");
let first_list = python[0][0][2];
let second_list = python[1][0][2];

View file

@ -190,7 +190,7 @@ mod tests {
fn from_tree() {
let ctx = ctx();
let tree = ctx.parse_json("[1, [2, 3]]");
let tree = ctx.parse("a.json", "[1, [2, 3]]");
let classmapping = ClassMapping::new();
let mut changeset = ChangeSet::new();
@ -237,7 +237,7 @@ mod tests {
fn single_tree_has_no_conflicts() {
let ctx = ctx();
let tree = ctx.parse_json("[1, [2, 3]]");
let tree = ctx.parse("a.json", "[1, [2, 3]]");
let classmapping = ClassMapping::new();
let mut changeset = ChangeSet::new();
@ -257,7 +257,7 @@ mod tests {
fn write_to_file() {
let ctx = ctx();
let tree = ctx.parse_json("[1, 2]");
let tree = ctx.parse("a.json", "[1, 2]");
let classmapping = ClassMapping::new();
let mut changeset = ChangeSet::new();

View file

@ -450,9 +450,9 @@ mod tests {
fn left_right_matching_does_not_override_base_matchings() {
let ctx = ctx();
let base_tree = ctx.parse_rust("struct Foo;\nstruct Bar;\n");
let left_tree = ctx.parse_rust("struct Foo;\n");
let right_tree = ctx.parse_rust("struct Bar;\n");
let base_tree = ctx.parse("a.rs", "struct Foo;\nstruct Bar;\n");
let left_tree = ctx.parse("a.rs", "struct Foo;\n");
let right_tree = ctx.parse("a.rs", "struct Bar;\n");
let foo_base = RevNode::new(Revision::Base, base_tree[0]);
assert_eq!(foo_base.node.source, "struct Foo;");
@ -491,9 +491,18 @@ mod tests {
fn classes_are_properly_merged() {
let ctx = ctx();
let base_tree = ctx.parse_rust("struct FooBase;\nstruct BarBase;\nstruct HeyBase;\n");
let left_tree = ctx.parse_rust("struct FooLeft;\nstruct BarLeft;\nstruct HeyLeft;\n");
let right_tree = ctx.parse_rust("struct FooRight;\nstruct BarRight;\nstruct HeyRight;\n");
let base_tree = ctx.parse(
"a.rs",
"struct FooBase;\nstruct BarBase;\nstruct HeyBase;\n",
);
let left_tree = ctx.parse(
"a.rs",
"struct FooLeft;\nstruct BarLeft;\nstruct HeyLeft;\n",
);
let right_tree = ctx.parse(
"a.rs",
"struct FooRight;\nstruct BarRight;\nstruct HeyRight;\n",
);
let foo_base = RevNode::new(Revision::Base, base_tree[0]);
let foo_left = RevNode::new(Revision::Left, left_tree[0]);

View file

@ -380,8 +380,8 @@ mod tests {
fn has_signature_conflicts() {
let ctx = ctx();
let with_conflicts = ctx.parse_json("[{\"a\":1, \"b\":2, \"a\":3}]");
let without_conflicts = ctx.parse_json("{\"a\": [4], \"b\": [4]}");
let with_conflicts = ctx.parse("a.json", "[{\"a\":1, \"b\":2, \"a\":3}]");
let without_conflicts = ctx.parse("a.json", "{\"a\": [4], \"b\": [4]}");
assert!(with_conflicts.has_signature_conflicts());
assert!(!without_conflicts.has_signature_conflicts());

View file

@ -222,8 +222,8 @@ mod tests {
fn retrieve_match() {
let ctx = ctx();
let tree = ctx.parse_rust("fn t() { 3 }");
let tree2 = ctx.parse_rust("fn t() { 1 }");
let tree = ctx.parse("a.rs", "fn t() { 3 }");
let tree2 = ctx.parse("a.rs", "fn t() { 1 }");
let mut matching = Matching::new();
assert_eq!(matching.len(), 0);
@ -237,8 +237,8 @@ mod tests {
fn remove_previously_matched() {
let ctx = ctx();
let tree1 = ctx.parse_json("[1, 2, 3]");
let tree2 = ctx.parse_json("[4, 5, 6]");
let tree1 = ctx.parse("a.json", "[1, 2, 3]");
let tree2 = ctx.parse("a.json", "[4, 5, 6]");
let mut matching = Matching::new();
@ -267,7 +267,7 @@ mod tests {
fn dice() {
let ctx = ctx();
let root = ctx.parse_rust("fn t() { 3 }");
let root = ctx.parse("a.rs", "fn t() { 3 }");
let mut matching = Matching::new();
assert_eq!(matching.dice(root, root), 0.0_f32);

View file

@ -329,9 +329,9 @@ mod tests {
fn single_tree_has_no_conflicts() {
let ctx = ctx();
let base = ctx.parse_json("[1, {\"a\":2}]");
let left = ctx.parse_json("[0, 1, {\"a\":2}]");
let right = ctx.parse_json("[1, {\"a\":2}, 3]");
let base = ctx.parse("a.json", "[1, {\"a\":2}]");
let left = ctx.parse("a.json", "[0, 1, {\"a\":2}]");
let right = ctx.parse("a.json", "[1, {\"a\":2}, 3]");
let (primary_matcher, auxiliary_matcher) = json_matchers();
@ -357,9 +357,9 @@ mod tests {
fn merge_conflict() {
let ctx = ctx();
let base = ctx.parse_json("[1, 2]");
let left = ctx.parse_json("[1, 3, 2]");
let right = ctx.parse_json("[1, 4, 2]");
let base = ctx.parse("a.json", "[1, 2]");
let left = ctx.parse("a.json", "[1, 3, 2]");
let right = ctx.parse("a.json", "[1, 4, 2]");
let (primary_matcher, auxiliary_matcher) = json_matchers();
@ -395,9 +395,9 @@ mod tests {
fn delete_delete() {
let ctx = ctx();
let base = ctx.parse_json("[1, 2]");
let left = ctx.parse_json("[1]");
let right = ctx.parse_json("[2]");
let base = ctx.parse("a.json", "[1, 2]");
let left = ctx.parse("a.json", "[1]");
let right = ctx.parse("a.json", "[2]");
let (primary_matcher, auxiliary_matcher) = json_matchers();
@ -433,9 +433,9 @@ mod tests {
fn delete_insert() {
let ctx = ctx();
let base = ctx.parse_json("[1, 2]");
let left = ctx.parse_json("[1]");
let right = ctx.parse_json("[1, 2, 3]");
let base = ctx.parse("a.json", "[1, 2]");
let left = ctx.parse("a.json", "[1]");
let right = ctx.parse("a.json", "[1, 2, 3]");
let (primary_matcher, auxiliary_matcher) = json_matchers();
@ -471,9 +471,9 @@ mod tests {
fn delete_modify() {
let ctx = ctx();
let base = ctx.parse_json("[1, {\"a\": 3}, 2]");
let left = ctx.parse_json("[1, {\"a\": 4}, 2]");
let right = ctx.parse_json("[1, 2]");
let base = ctx.parse("a.json", "[1, {\"a\": 3}, 2]");
let left = ctx.parse("a.json", "[1, {\"a\": 4}, 2]");
let right = ctx.parse("a.json", "[1, 2]");
let (primary_matcher, auxiliary_matcher) = json_matchers();
@ -509,9 +509,9 @@ mod tests {
fn commutative_conflict_end_separator() {
let ctx = ctx();
let base = ctx.parse_json("{\"x\": 0}");
let left = ctx.parse_json("{\"a\": 1, \"x\": 0}");
let right = ctx.parse_json("{\"b\": 2, \"x\": 0}");
let base = ctx.parse("a.json", "{\"x\": 0}");
let left = ctx.parse("a.json", "{\"a\": 1, \"x\": 0}");
let right = ctx.parse("a.json", "{\"b\": 2, \"x\": 0}");
let (primary_matcher, auxiliary_matcher) = json_matchers();
@ -536,9 +536,9 @@ mod tests {
fn commutative_conflict_no_end_separator() {
let ctx = ctx();
let base = ctx.parse_json("{}");
let left = ctx.parse_json("{\"a\": 1}");
let right = ctx.parse_json("{\"b\": 2}");
let base = ctx.parse("a.json", "{}");
let left = ctx.parse("a.json", "{\"a\": 1}");
let right = ctx.parse("a.json", "{\"b\": 2}");
let (primary_matcher, auxiliary_matcher) = json_matchers();
@ -563,9 +563,9 @@ mod tests {
fn commutative_conflict_double_delete() {
let ctx = ctx();
let base = ctx.parse_json("{\"a\": 1, \"b\": 2}");
let left = ctx.parse_json("{\"a\": 1}");
let right = ctx.parse_json("{\"b\": 2}");
let base = ctx.parse("a.json", "{\"a\": 1, \"b\": 2}");
let left = ctx.parse("a.json", "{\"a\": 1}");
let right = ctx.parse("a.json", "{\"b\": 2}");
let (primary_matcher, auxiliary_matcher) = json_matchers();
@ -590,9 +590,9 @@ mod tests {
fn commutative_conflict_delete_modified() {
let ctx = ctx();
let base = ctx.parse_json("{\"a\": {\"x\": 1}, \"b\": 2}");
let left = ctx.parse_json("{\"a\": {\"x\": 2}}");
let right = ctx.parse_json("{\"b\": 2}");
let base = ctx.parse("a.json", "{\"a\": {\"x\": 1}, \"b\": 2}");
let left = ctx.parse("a.json", "{\"a\": {\"x\": 2}}");
let right = ctx.parse("a.json", "{\"b\": 2}");
let (primary_matcher, auxiliary_matcher) = json_matchers();
@ -636,9 +636,9 @@ mod tests {
// both `left` and `right` add the `'s` to `&self`, so this would-be-conflict should be
// resolved during the construction of the tree. NB: The `<'s>` is added just so that
// `left` and `right` are not completely identical (which would've made the resolution trivial)
let base = ctx.parse_rust("fn foo(&self) {}");
let left = ctx.parse_rust("fn foo(&'s self) {}");
let right = ctx.parse_rust("fn foo<'s>(&'s self) {}");
let base = ctx.parse("a.rs", "fn foo(&self) {}");
let left = ctx.parse("a.rs", "fn foo(&'s self) {}");
let right = ctx.parse("a.rs", "fn foo<'s>(&'s self) {}");
let (primary_matcher, auxiliary_matcher) = rust_matchers();
@ -706,9 +706,9 @@ fn baz() {
eprintln!();
}";
let base = ctx.parse_rust(base);
let left = ctx.parse_rust(left);
let right = ctx.parse_rust(right);
let base = ctx.parse("a.rs", base);
let left = ctx.parse("a.rs", left);
let right = ctx.parse("a.rs", right);
let primary_matcher = TreeMatcher {
min_height: 1,

View file

@ -532,9 +532,9 @@ mod test {
#[test]
fn debug_print() {
let ctx = ctx();
let base = ctx.parse_json("[1, 1]");
let left = ctx.parse_json("[1, 2]");
let right = ctx.parse_json("[2, 1]");
let base = ctx.parse("a.json", "[1, 1]");
let left = ctx.parse("a.json", "[1, 2]");
let right = ctx.parse("a.json", "[2, 1]");
let (primary_matcher, auxiliary_matcher) = json_matchers();
let (merged_tree, _) = three_way_merge(

View file

@ -1222,8 +1222,8 @@ struct MyType {
let left_rev = parsed.reconstruct_revision(Revision::Left);
let right_rev = parsed.reconstruct_revision(Revision::Right);
let parsed_left = ctx.parse_rust(&left_rev);
let parsed_right = ctx.parse_rust(&right_rev);
let parsed_left = ctx.parse("a.rs", &left_rev);
let parsed_right = ctx.parse("a.rs", &right_rev);
let matching = parsed.generate_matching(
Revision::Left,
@ -1266,8 +1266,8 @@ struct MyType {
let base_rev = parsed.reconstruct_revision(Revision::Base);
let left_rev = parsed.reconstruct_revision(Revision::Left);
let parsed_base = ctx.parse_nix(&base_rev);
let parsed_left = ctx.parse_nix(&left_rev);
let parsed_base = ctx.parse("a.nix", &base_rev);
let parsed_left = ctx.parse("a.nix", &left_rev);
let binding_set_base = parsed_base[0][2][1];
assert_eq!(binding_set_base.grammar_name, "binding_set");

View file

@ -408,8 +408,8 @@ mod tests {
fn equal_signatures() {
let ctx = ctx();
let document = ctx.parse_json("{\"a\":\"b\"}");
let other_document = ctx.parse_json("{\"a\":\"c\"}");
let document = ctx.parse("a.json", "{\"a\":\"b\"}");
let other_document = ctx.parse("a.json", "{\"a\":\"c\"}");
let object = document[0];
let pair = object[1];
let other_pair = other_document[0][1];
@ -435,8 +435,8 @@ mod tests {
fn node_equality_and_hashing() {
let ctx = ctx();
let object = ctx.parse_json("{\"a\":\"b\"}")[0];
let object_2 = ctx.parse_json("[{\"a\": \"b\"}]")[0][1];
let object = ctx.parse("a.json", "{\"a\":\"b\"}")[0];
let object_2 = ctx.parse("a.json", "[{\"a\": \"b\"}]")[0][1];
let class_mapping = ClassMapping::new();
let node_2 = class_mapping.map_to_leader(RevNode {
@ -493,8 +493,8 @@ mod tests {
fn node_equality_and_hashing_care_about_languages() {
let ctx = ctx();
let tree_python = ctx.parse_python("foo()");
let tree_java = ctx.parse_java("foo();");
let tree_python = ctx.parse("a.py", "foo()");
let tree_java = ctx.parse("a.java", "foo();");
let args_python = tree_python[0][0][1];
let args_java = tree_java[0][0][1];

View file

@ -17,52 +17,12 @@ pub fn ctx<'a>() -> TestContext<'a> {
}
impl<'a> TestContext<'a> {
fn parse_internal(&'a self, extension: &str, source: &'a str) -> &'a AstNode<'a> {
pub fn parse(&'a self, filename: &str, source: &'a str) -> &'a AstNode<'a> {
let lang_profile =
LangProfile::detect_from_filename(extension).expect("could not load language profile");
LangProfile::detect_from_filename(filename).expect("could not load language profile");
AstNode::parse(source, lang_profile, &self.arena, &self.ref_arena)
.expect("syntax error in source")
}
pub fn parse_rust(&'a self, source: &'a str) -> &'a AstNode<'a> {
self.parse_internal("a.rs", source)
}
pub fn parse_json(&'a self, source: &'a str) -> &'a AstNode<'a> {
self.parse_internal("a.json", source)
}
pub fn parse_html(&'a self, source: &'a str) -> &'a AstNode<'a> {
self.parse_internal("a.html", source)
}
pub fn parse_markdown(&'a self, source: &'a str) -> &'a AstNode<'a> {
self.parse_internal("a.md", source)
}
pub fn parse_java(&'a self, source: &'a str) -> &'a AstNode<'a> {
self.parse_internal("a.java", source)
}
pub fn parse_python(&'a self, source: &'a str) -> &'a AstNode<'a> {
self.parse_internal("a.py", source)
}
pub fn parse_go(&'a self, source: &'a str) -> &'a AstNode<'a> {
self.parse_internal("a.go", source)
}
pub fn parse_yaml(&'a self, source: &'a str) -> &'a AstNode<'a> {
self.parse_internal("a.yaml", source)
}
pub fn parse_toml(&'a self, source: &'a str) -> &'a AstNode<'a> {
self.parse_internal("a.toml", source)
}
pub fn parse_nix(&'a self, source: &'a str) -> &'a AstNode<'a> {
self.parse_internal("a.nix", source)
}
}
pub(crate) fn json_matchers() -> (TreeMatcher, TreeMatcher) {

View file

@ -1036,7 +1036,7 @@ mod tests {
fn recover_exact_tree() {
let ctx = ctx();
let tree = ctx.parse_json("[1, [2, 3]]");
let tree = ctx.parse("a.json", "[1, [2, 3]]");
let class_mapping = ClassMapping::new();
let mut changeset = ChangeSet::new();
@ -1068,7 +1068,7 @@ mod tests {
fn contains() {
let ctx = ctx();
let tree = ctx.parse_json("[1, [2, 3]]");
let tree = ctx.parse("a.json", "[1, [2, 3]]");
let class_mapping = ClassMapping::new();
let mut changeset = ChangeSet::new();

View file

@ -504,8 +504,8 @@ mod tests {
fn small_sample() {
let ctx = ctx();
let t1 = ctx.parse_rust("fn my_func() -> i32 { 1 + (3 + (5 - 1)) }");
let t2 = ctx.parse_rust("fn other_func() { (3 + (5 - 1)) * 2 }");
let t1 = ctx.parse("a.rs", "fn my_func() -> i32 { 1 + (3 + (5 - 1)) }");
let t2 = ctx.parse("a.rs", "fn other_func() { (3 + (5 - 1)) * 2 }");
let matcher = TreeMatcher {
min_height: 2,
@ -526,10 +526,11 @@ mod tests {
fn example_from_the_paper() {
let ctx = ctx();
let t1 = ctx.parse_java(
let t1 = ctx.parse(
"a.java",
"public class Test { public String foo(int i) { if (i == 0) return \"Foo!\"; } }",
);
let t2 = ctx.parse_java("public class Test { private String foo(int i) { if (i == 0) return \"Bar\"; else if (i == -1) return \"Foo!\"; } }");
let t2 = ctx.parse("a.java", "public class Test { private String foo(int i) { if (i == 0) return \"Bar\"; else if (i == -1) return \"Foo!\"; } }");
let matcher = TreeMatcher {
min_height: 2,
@ -550,10 +551,11 @@ mod tests {
fn without_rted() {
let ctx = ctx();
let t1 = ctx.parse_java(
let t1 = ctx.parse(
"a.java",
"public class Test { public String foo(int i) { if (i == 0) return \"Foo!\"; } }",
);
let t2 = ctx.parse_java("public class Test { private String foo(int i) { if (i == 0) return \"Bar\"; else if (i == -1) return \"Foo!\"; } }");
let t2 = ctx.parse("a.java", "public class Test { private String foo(int i) { if (i == 0) return \"Bar\"; else if (i == -1) return \"Foo!\"; } }");
let matcher = TreeMatcher {
min_height: 2,
@ -574,8 +576,8 @@ mod tests {
fn matching_very_shallow_structures() {
let ctx = ctx();
let left = ctx.parse_json("[1, 2]");
let right = ctx.parse_json("[0, 1, 2]");
let left = ctx.parse("a.json", "[1, 2]");
let right = ctx.parse("a.json", "[0, 1, 2]");
let matcher = TreeMatcher {
min_height: 0,
@ -596,8 +598,8 @@ mod tests {
fn matching_rust_types() {
let ctx = ctx();
let left = ctx.parse_rust("use std::collections::{HashMap};");
let right = ctx.parse_rust("use std::collections::{HashMap, HashSet};");
let left = ctx.parse("a.rs", "use std::collections::{HashMap};");
let right = ctx.parse("a.rs", "use std::collections::{HashMap, HashSet};");
let matcher = TreeMatcher {
min_height: 2,

View file

@ -88,7 +88,7 @@ mod tests {
let ctx = ctx();
let mut priority_list = PriorityList::new();
let node = ctx.parse_rust("fn x() -> i32 { 1 + 2 }");
let node = ctx.parse("a.rs", "fn x() -> i32 { 1 + 2 }");
priority_list.push(node);
assert_eq!(priority_list.peek_max(), Some(4));
@ -100,9 +100,9 @@ mod tests {
let ctx = ctx();
let mut priority_list = PriorityList::new();
let node1 = ctx.parse_rust("fn y() -> u8 { 1 + 2 }");
let node1 = ctx.parse("a.rs", "fn y() -> u8 { 1 + 2 }");
priority_list.push(node1);
let node2 = ctx.parse_rust("fn z() { 3 * 5 }");
let node2 = ctx.parse("a.rs", "fn z() { 3 * 5 }");
priority_list.push(node2);
assert_eq!(priority_list.peek_max(), Some(4));
@ -114,9 +114,9 @@ mod tests {
let ctx = ctx();
let mut priority_list = PriorityList::new();
let node1 = ctx.parse_rust("fn a() { 1 + 2 }");
let node1 = ctx.parse("a.rs", "fn a() { 1 + 2 }");
priority_list.push(node1);
let node2 = ctx.parse_rust("fn b() { 3 * (5 + 1) }");
let node2 = ctx.parse("a.rs", "fn b() { 3 * (5 + 1) }");
priority_list.push(node2);
assert_eq!(priority_list.peek_max(), Some(6));
@ -128,9 +128,9 @@ mod tests {
let ctx = ctx();
let mut priority_list = PriorityList::new();
let node1 = ctx.parse_rust("fn c() { 1 + (2 + 5) }");
let node1 = ctx.parse("a.rs", "fn c() { 1 + (2 + 5) }");
priority_list.push(node1);
let node2 = ctx.parse_rust("fn d() { 3 * 9 }");
let node2 = ctx.parse("a.rs", "fn d() { 3 * 9 }");
priority_list.push(node2);
assert_eq!(priority_list.peek_max(), Some(6));
@ -142,7 +142,7 @@ mod tests {
let ctx = ctx();
let mut priority_list = PriorityList::new();
let node1 = ctx.parse_rust("fn x() { 1 + (2 + 5) }");
let node1 = ctx.parse("a.rs", "fn x() { 1 + (2 + 5) }");
let node1 = node1[0][3][1];
priority_list.open(node1);
let child1 = node1[0];

View file

@ -179,8 +179,8 @@ mod tests {
let target_path = repo_dir.path().join("graph.dot");
let ctx = ctx();
let parsed_left = ctx.parse_json("{\"foo\": 3}");
let parsed_right = ctx.parse_json("{\"foo\": 4}");
let parsed_left = ctx.parse("a.json", "{\"foo\": 3}");
let parsed_right = ctx.parse("a.json", "{\"foo\": 4}");
let matching = DetailedMatching::default();
matching_to_graph(&target_path, parsed_left, parsed_right, &matching).unwrap();