Skip to main content

lex_core/lex/token/
testing.rs

1//! Test factories for creating locations and spanned tokens succinctly.
2//!
3//! The lexer and parser now require every token to carry a byte-span. These helpers
4//! keep tests concise while enforcing that requirement.
5
6use std::ops::Range;
7
8use super::core::Token;
9
10/// Canonical alias for spanned tokens used across tests
11pub type Tokens = Vec<(Token, Range<usize>)>;
12
13/// Make a byte range location
14pub fn make_loc(start: usize, end: usize) -> Range<usize> {
15    start..end
16}
17
18/// Make a single spanned token
19pub fn mk_token(token: Token, start: usize, end: usize) -> (Token, Range<usize>) {
20    (token, make_loc(start, end))
21}
22
23/// Make a vector of spanned tokens from a list of (Token, start, end)
24pub fn mk_tokens(specs: &[(Token, usize, usize)]) -> Tokens {
25    specs
26        .iter()
27        .cloned()
28        .map(|(t, s, e)| mk_token(t, s, e))
29        .collect()
30}
31
32/// Create tokens with zero-length spans for convenience in tests that only
33/// care about token order.
34pub fn mk_tokens_with_dummy_span(tokens: Vec<Token>) -> Tokens {
35    tokens
36        .into_iter()
37        .map(|token| mk_token(token, 0, 0))
38        .collect()
39}