Skip to content

Commit

Permalink
feat,test: selection language
Browse files Browse the repository at this point in the history
  • Loading branch information
justinpombrio committed Apr 12, 2024
1 parent 1c629ae commit 3491219
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 0 deletions.
46 changes: 46 additions & 0 deletions data/selection_lang.ron
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
// TODO: styles

LanguageSpec(
name: "SelectionMenu",
grammar: GrammarSpec(
constructs: [
ConstructSpec(
name: "Root",
arity: Listy(SortSpec(["element"])),
),
ConstructSpec(
name: "Input",
arity: Texty,
),
ConstructSpec(
name: "Custom",
arity: Texty,
),
ConstructSpec(
name: "Literal",
arity: Texty,
),
ConstructSpec(
name: "NonLiteral",
arity: Texty,
),
],
sorts: [
("element", SortSpec(["Input", "Custom", "Literal", "NonLiteral"]))
],
root_construct: "Root",
),
default_display_notation: NotationSetSpec(
name: "DefaultDisplay",
notations: [
("Root", Fold(
first: Child(0),
join: Concat(Left, Concat(Newline, Right)),
)),
("Input", Concat(Literal("> "), Text)),
("Custom", Concat(Literal("[+] "), Text)),
("Literal", Text),
("NonLiteral", Text),
]
),
)
42 changes: 42 additions & 0 deletions tests/selection.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
use std::fs;
use std::path::Path;
use synless::{DocName, Engine, Location, Node, Settings, Storage};

const SELECTION_PATH: &str = "data/selection_lang.ron";
const SELECTION_NOTATION_NAME: &str = "DefaultDisplay";

#[test]
fn test_selection_lang() {
let mut engine = Engine::new(Settings::default());

let selection_lang_ron = fs::read_to_string(SELECTION_PATH).unwrap();
let language_name = engine
.load_language_ron(Path::new(SELECTION_PATH), &selection_lang_ron)
.unwrap();
engine
.set_source_notation(&language_name, SELECTION_NOTATION_NAME)
.unwrap();

let doc_name = DocName::Auxilliary("<testing>".to_owned());
engine.add_empty_doc(&doc_name, &language_name).unwrap();

let mut cursor = engine.get_doc(&doc_name).unwrap().cursor();
let s = engine.raw_storage_mut();
let lang = s.language(&language_name).unwrap();

let add_elem = |s: &mut Storage, cursor: &mut Location, construct_name: &str, text: &str| {
let construct = lang.construct(s, construct_name).unwrap();
let node = Node::with_text(s, construct, text.to_owned()).unwrap();
cursor.insert(s, node).unwrap();
};

add_elem(s, &mut cursor, "Input", "oo");
add_elem(s, &mut cursor, "Custom", "oo");
add_elem(s, &mut cursor, "Literal", "foobar.rs");
add_elem(s, &mut cursor, "NonLiteral", "..");
add_elem(s, &mut cursor, "Literal", "baz.rs");

let output = engine.print_source(&doc_name).unwrap();
let expected = "> oo\n[+] oo\nfoobar.rs\n..\nbaz.rs";
assert_eq!(output, expected);
}

0 comments on commit 3491219

Please sign in to comment.