test: add test for goto_definition for label (#510)

* add test for `goto_definition` with label reference

* simplify test for `goto_definition` with reference

* abstract compile doc for test

* add snap for goto_definition label reference
This commit is contained in:
Yifan Song 2024-08-12 11:08:34 +02:00 committed by GitHub
parent 6b8380ade7
commit 0fce237d57
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 54 additions and 22 deletions

View file

@ -320,16 +320,9 @@ mod tests {
let mut includes = HashSet::new();
let mut excludes = HashSet::new();
let must_compile = properties
.get("compile")
.map(|v| v.trim() == "true")
.unwrap_or(false);
let must_compile = has_test_property(&properties, "compile");
let doc = if must_compile {
let doc = typst::compile(ctx.world(), &mut Default::default()).unwrap();
Some(VersionedDocument {
version: 0,
document: Arc::new(doc),
})
compile_doc_for_test(ctx)
} else {
None
};

View file

@ -0,0 +1,7 @@
// compile:true
#set heading(numbering: "1.")
= Labeled <title_label>
/* position after */ @title_label

View file

@ -0,0 +1,12 @@
---
source: crates/tinymist-query/src/goto_definition.rs
expression: "JsonRepr::new_redacted(result, &REDACT_LOC)"
input_file: crates/tinymist-query/src/fixtures/goto_definition/label.typ
---
[
{
"originSelectionRange": "6:21:6:33",
"targetRange": "4:0:4:9",
"targetSelectionRange": "4:0:4:9"
}
]

View file

@ -57,20 +57,30 @@ impl StatefulRequest for GotoDefinitionRequest {
#[cfg(test)]
mod tests {
use crate::syntax::find_module_level_docs;
use super::*;
use crate::tests::*;
#[test]
fn test() {
snapshot_testing("goto_definition", &|world, path| {
let source = world.source_by_path(&path).unwrap();
snapshot_testing("goto_definition", &|ctx, path| {
let source = ctx.source_by_path(&path).unwrap();
let docs = find_module_level_docs(&source).unwrap_or_default();
let properties = get_test_properties(&docs);
let must_compile = has_test_property(&properties, "compile");
let doc = if must_compile {
compile_doc_for_test(ctx)
} else {
None
};
let request = GotoDefinitionRequest {
path: path.clone(),
position: find_test_position(&source),
};
let result = request.request(world, None);
let result = request.request(ctx, doc.clone());
assert_snapshot!(JsonRepr::new_redacted(result, &REDACT_LOC));
});
}

View file

@ -5,7 +5,7 @@ use std::{
ops::Range,
path::{Path, PathBuf},
};
use std::sync::Arc;
use once_cell::sync::Lazy;
pub use serde::Serialize;
use serde_json::{ser::PrettyFormatter, Serializer, Value};
@ -26,11 +26,7 @@ use typst_ts_core::{config::CompileOpts, package::PackageSpec};
pub use insta::assert_snapshot;
pub use typst_ts_compiler::TypstSystemWorld;
use crate::{
analysis::{Analysis, AnalysisResources},
prelude::AnalysisContext,
typst_to_lsp, LspPosition, PositionEncoding,
};
use crate::{analysis::{Analysis, AnalysisResources}, prelude::AnalysisContext, typst_to_lsp, LspPosition, PositionEncoding, VersionedDocument};
struct WrapWorld<'a>(&'a mut TypstSystemWorld);
@ -95,6 +91,21 @@ pub fn get_test_properties(s: &str) -> HashMap<&'_ str, &'_ str> {
props
}
pub fn has_test_property(properties: &HashMap<&'_ str, &'_ str>, prop: &str) -> bool {
properties
.get(prop)
.map(|v| v.trim() == "true")
.unwrap_or(false)
}
pub fn compile_doc_for_test(ctx: &mut AnalysisContext) -> Option<VersionedDocument> {
let doc = typst::compile(ctx.world(), &mut Default::default()).unwrap();
Some(VersionedDocument {
version: 0,
document: Arc::new(doc),
})
}
pub fn run_with_sources<T>(
source: &str,
f: impl FnOnce(&mut TypstSystemUniverse, PathBuf) -> T,
@ -201,10 +212,9 @@ pub fn find_test_position_(s: &Source, offset: usize) -> LspPosition {
}
use AstMatcher::*;
let re = s
.text()
.find("/* position */")
.map(|e| (e, MatchAny { prev: true }));
let re = s.text()
.find("/* position */")
.zip(Some(MatchAny { prev: true }));
let re = re.or_else(|| {
s.text()
.find("/* position after */")