aboutsummaryrefslogtreecommitdiff
path: root/helix-core/tests/indent.rs
diff options
context:
space:
mode:
Diffstat (limited to 'helix-core/tests/indent.rs')
-rw-r--r--helix-core/tests/indent.rs68
1 files changed, 68 insertions, 0 deletions
diff --git a/helix-core/tests/indent.rs b/helix-core/tests/indent.rs
new file mode 100644
index 00000000..ff04d05f
--- /dev/null
+++ b/helix-core/tests/indent.rs
@@ -0,0 +1,68 @@
+use helix_core::{
+ indent::{treesitter_indent_for_pos, IndentStyle},
+ syntax::Loader,
+ Syntax,
+};
+use std::path::PathBuf;
+
+#[test]
+fn test_treesitter_indent_rust() {
+ test_treesitter_indent("rust.rs", "source.rust");
+}
+#[test]
+fn test_treesitter_indent_rust_2() {
+ test_treesitter_indent("indent.rs", "source.rust");
+ // TODO Use commands.rs as indentation test.
+ // Currently this fails because we can't align the parameters of a closure yet
+ // test_treesitter_indent("commands.rs", "source.rust");
+}
+
+fn test_treesitter_indent(file_name: &str, lang_scope: &str) {
+ let mut test_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
+ test_dir.push("tests/data/indent");
+
+ let mut test_file = test_dir.clone();
+ test_file.push(file_name);
+ let test_file = std::fs::File::open(test_file).unwrap();
+ let doc = ropey::Rope::from_reader(test_file).unwrap();
+
+ let mut config_file = test_dir;
+ config_file.push("languages.toml");
+ let config = std::fs::read(config_file).unwrap();
+ let config = toml::from_slice(&config).unwrap();
+ let loader = Loader::new(config);
+
+ // set runtime path so we can find the queries
+ let mut runtime = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"));
+ runtime.push("../runtime");
+ std::env::set_var("HELIX_RUNTIME", runtime.to_str().unwrap());
+
+ let language_config = loader.language_config_for_scope(lang_scope).unwrap();
+ let highlight_config = language_config.highlight_config(&[]).unwrap();
+ let syntax = Syntax::new(&doc, highlight_config, std::sync::Arc::new(loader));
+ let indent_query = language_config.indent_query().unwrap();
+ let text = doc.slice(..);
+
+ for i in 0..doc.len_lines() {
+ let line = text.line(i);
+ if let Some(pos) = helix_core::find_first_non_whitespace_char(line) {
+ let suggested_indent = treesitter_indent_for_pos(
+ indent_query,
+ &syntax,
+ &IndentStyle::Spaces(4),
+ text,
+ i,
+ text.line_to_char(i) + pos,
+ false,
+ )
+ .unwrap();
+ assert!(
+ line.get_slice(..pos).map_or(false, |s| s == suggested_indent),
+ "Wrong indentation on line {}:\n\"{}\" (original line)\n\"{}\" (suggested indentation)\n",
+ i+1,
+ line.slice(..line.len_chars()-1),
+ suggested_indent,
+ );
+ }
+ }
+}