use serde::{
Deserialize,
Serialize,
};
pub use crate::{
partitions::text_document_position::PositionKind,
protocol::lsp::Position,
};
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TextDocumentPositionParams {
pub text_document: crate::protocol::lsp::TextDocumentIdentifier,
pub position: Position,
}
#[cfg(test)]
mod tests {
use {
super::*,
crate::{
SourceKey,
partitions::text_document_position::{
PositionKind,
TextDocumentPositionSortKey,
},
},
};
#[test]
fn test_sort_key_format() {
let source_key = SourceKey::new(10, 1);
let position = Position::new(5, 12);
let sort_key = TextDocumentPositionSortKey::Position {
source_key,
line: position.line,
character: position.character,
kind: PositionKind::Ident,
}
.to_string();
assert_eq!(sort_key, "10v1|0000000005|0000000012|1");
}
#[test]
fn test_sort_key_ordering() {
let source_key = SourceKey::new(10, 1);
let pos1 = TextDocumentPositionSortKey::Position {
source_key,
line: 0,
character: 0,
kind: PositionKind::Ident,
}
.to_string();
let pos2 = TextDocumentPositionSortKey::Position {
source_key,
line: 0,
character: 10,
kind: PositionKind::Ident,
}
.to_string();
let pos3 = TextDocumentPositionSortKey::Position {
source_key,
line: 1,
character: 0,
kind: PositionKind::Ident,
}
.to_string();
assert!(pos1 < pos2);
assert!(pos2 < pos3);
}
#[test]
fn test_sort_key_same_file_different_positions() {
let source_key = SourceKey::new(42, 5);
let pos_line5 = TextDocumentPositionSortKey::Position {
source_key,
line: 5,
character: 0,
kind: PositionKind::Symbol,
}
.to_string();
let pos_line10 = TextDocumentPositionSortKey::Position {
source_key,
line: 10,
character: 0,
kind: PositionKind::Symbol,
}
.to_string();
let pos_line15 = TextDocumentPositionSortKey::Position {
source_key,
line: 15,
character: 0,
kind: PositionKind::Symbol,
}
.to_string();
assert!(pos_line5 < pos_line10);
assert!(pos_line10 < pos_line15);
}
#[test]
fn test_sort_key_different_files() {
let source_key_1 = SourceKey::new(10, 1);
let source_key_2 = SourceKey::new(20, 1);
let pos1 = TextDocumentPositionSortKey::Position {
source_key: source_key_1,
line: 0,
character: 0,
kind: PositionKind::Reference,
}
.to_string();
let pos2 = TextDocumentPositionSortKey::Position {
source_key: source_key_2,
line: 0,
character: 0,
kind: PositionKind::Reference,
}
.to_string();
assert_ne!(pos1, pos2);
assert!(pos1 < pos2);
}
#[test]
fn test_sort_key_different_kinds_same_position() {
let source_key = SourceKey::new(10, 1);
let position = Position::new(5, 10);
let ident = TextDocumentPositionSortKey::Position {
source_key,
line: position.line,
character: position.character,
kind: PositionKind::Ident,
}
.to_string();
let symbol = TextDocumentPositionSortKey::Position {
source_key,
line: position.line,
character: position.character,
kind: PositionKind::Symbol,
}
.to_string();
let reference = TextDocumentPositionSortKey::Position {
source_key,
line: position.line,
character: position.character,
kind: PositionKind::Reference,
}
.to_string();
assert_eq!(ident, "10v1|0000000005|0000000010|1");
assert_eq!(symbol, "10v1|0000000005|0000000010|2");
assert_eq!(reference, "10v1|0000000005|0000000010|3");
assert!(ident < symbol);
assert!(symbol < reference);
}
}