mirror of
https://github.com/Myriad-Dreamin/tinymist.git
synced 2025-08-03 17:58:17 +00:00
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:
parent
6b8380ade7
commit
0fce237d57
5 changed files with 54 additions and 22 deletions
|
@ -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
|
||||
};
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
// compile:true
|
||||
|
||||
#set heading(numbering: "1.")
|
||||
|
||||
= Labeled <title_label>
|
||||
|
||||
/* position after */ @title_label
|
|
@ -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"
|
||||
}
|
||||
]
|
|
@ -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));
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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 */")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue