mirror of
https://github.com/Strum355/mcshader-lsp.git
synced 2025-08-31 22:07:30 +00:00
161 lines
5.3 KiB
Rust
161 lines
5.3 KiB
Rust
use super::*;
|
|
use std::io;
|
|
use std::io::Result;
|
|
use tempdir::TempDir;
|
|
use std::fs;
|
|
|
|
use fs_extra;
|
|
|
|
use jsonrpc_common::*;
|
|
use jsonrpc_response::*;
|
|
|
|
struct StdoutNewline {
|
|
s: io::Stdout
|
|
}
|
|
|
|
impl io::Write for StdoutNewline {
|
|
fn write(&mut self, buf: &[u8]) -> Result<usize> {
|
|
let res = self.s.write(buf);
|
|
if buf[buf.len()-1] == "}".as_bytes()[0] {
|
|
#[allow(unused_variables)]
|
|
let res = self.s.write("\n\n".as_bytes());
|
|
}
|
|
res
|
|
}
|
|
|
|
fn flush(&mut self) -> Result<()> {
|
|
self.s.flush()
|
|
}
|
|
}
|
|
|
|
fn new_temp_server() -> MinecraftShaderLanguageServer {
|
|
let endpoint = LSPEndpoint::create_lsp_output_with_output_stream(|| StdoutNewline{s: io::stdout()});
|
|
|
|
MinecraftShaderLanguageServer{
|
|
endpoint,
|
|
graph: Rc::new(RefCell::new(graph::CachedStableGraph::new())),
|
|
config: Configuration::default(),
|
|
wait: WaitGroup::new(),
|
|
root: None,
|
|
command_provider: None,
|
|
}
|
|
}
|
|
|
|
fn copy_files(files: &str, dest: &TempDir) {
|
|
let opts = &fs_extra::dir::CopyOptions::new();
|
|
let files = fs::read_dir(files).unwrap().map(|e| String::from(e.unwrap().path().as_os_str().to_str().unwrap())).collect::<Vec<String>>();
|
|
fs_extra::copy_items(&files, dest.path().join("shaders"), opts).unwrap();
|
|
}
|
|
|
|
#[allow(deprecated)]
|
|
#[test]
|
|
fn test_empty_initialize() {
|
|
let mut server = new_temp_server();
|
|
|
|
let tmp_dir = TempDir::new("mcshader").unwrap();
|
|
let tmp_path = tmp_dir.path().as_os_str().to_str().unwrap();
|
|
let tmp_uri = format!("{}{}", "file://", tmp_path);
|
|
|
|
let initialize_params = InitializeParams{
|
|
process_id: None,
|
|
root_path: None,
|
|
root_uri: Some(Url::parse(tmp_uri.as_str()).unwrap()),
|
|
client_info: None,
|
|
initialization_options: None,
|
|
capabilities: ClientCapabilities{workspace: None, text_document: None, experimental: None, window: None},
|
|
trace: None,
|
|
workspace_folders: None,
|
|
};
|
|
|
|
let on_response = |resp: Option<Response>| {
|
|
assert!(resp.is_some());
|
|
let respu = resp.unwrap();
|
|
match respu.result_or_error {
|
|
ResponseResult::Result(_) => {},
|
|
ResponseResult::Error(e) => { panic!(format!("expected ResponseResult::Result(..), got {:?}", e)) }
|
|
}
|
|
};
|
|
|
|
let completable = MethodCompletable::new(ResponseCompletable::new(Some(Id::Number(1)), Box::new(on_response)));
|
|
server.initialize(initialize_params, completable);
|
|
|
|
assert_eq!(server.root, Some(String::from(tmp_path)));
|
|
|
|
assert_eq!(server.graph.borrow().graph.edge_count(), 0);
|
|
assert_eq!(server.graph.borrow().graph.node_count(), 0);
|
|
|
|
assert_eq!(format!("{:?}", server.wait), "WaitGroup { count: 1 }");
|
|
|
|
server.endpoint.request_shutdown();
|
|
//std::thread::sleep(std::time::Duration::from_secs(1));
|
|
}
|
|
|
|
#[allow(deprecated)]
|
|
#[test]
|
|
fn test_01_initialize() {
|
|
let mut server = new_temp_server();
|
|
|
|
let tmp_dir = TempDir::new("mcshader").unwrap();
|
|
fs::create_dir(tmp_dir.path().join("shaders")).unwrap();
|
|
|
|
copy_files("./testdata/01", &tmp_dir);
|
|
|
|
let tmp_path = tmp_dir.path().as_os_str().to_str().unwrap();
|
|
let tmp_uri = format!("{}{}", "file://", tmp_path);
|
|
|
|
let initialize_params = InitializeParams{
|
|
process_id: None,
|
|
root_path: None,
|
|
root_uri: Some(Url::parse(tmp_uri.as_str()).unwrap()),
|
|
client_info: None,
|
|
initialization_options: None,
|
|
capabilities: ClientCapabilities{workspace: None, text_document: None, experimental: None, window: None},
|
|
trace: None,
|
|
workspace_folders: None,
|
|
};
|
|
|
|
let on_response = |resp: Option<Response>| {
|
|
assert!(resp.is_some());
|
|
let respu = resp.unwrap();
|
|
match respu.result_or_error {
|
|
ResponseResult::Result(_) => {},
|
|
ResponseResult::Error(e) => { panic!(format!("expected ResponseResult::Result(..), got {:?}", e)) }
|
|
}
|
|
};
|
|
|
|
let completable = MethodCompletable::new(ResponseCompletable::new(Some(Id::Number(1)), Box::new(on_response)));
|
|
server.initialize(initialize_params, completable);
|
|
|
|
// Assert there is one edge between two nodes
|
|
assert_eq!(server.graph.borrow().graph.edge_count(), 1);
|
|
|
|
let edge = server.graph.borrow().graph.edge_indices().next().unwrap();
|
|
let (node1, node2) = server.graph.borrow().graph.edge_endpoints(edge).unwrap();
|
|
|
|
// Assert the values of the two nodes in the tree
|
|
assert_eq!(server.graph.borrow().graph[node1].as_str(), tmp_dir.path().join("shaders").join("final.fsh").as_os_str().to_str().unwrap());
|
|
assert_eq!(server.graph.borrow().graph[node2].as_str(), tmp_dir.path().join("shaders").join("common.glsl").as_os_str().to_str().unwrap());
|
|
|
|
server.endpoint.request_shutdown();
|
|
}
|
|
|
|
#[test]
|
|
fn test_graph_two_connected_nodes() {
|
|
let mut graph = graph::CachedStableGraph::new();
|
|
|
|
graph.add_node("sample");
|
|
graph.add_node("banana");
|
|
let idx1 = graph.find_node("sample").unwrap();
|
|
let idx2 = graph.find_node("banana").unwrap();
|
|
graph.add_edge(idx1, idx2);
|
|
|
|
let neighbors = graph.neighbors(idx1);
|
|
assert_eq!(neighbors.len(), 1);
|
|
assert_eq!(neighbors[0], "banana");
|
|
|
|
graph.remove_node("sample");
|
|
assert_eq!(graph.graph.node_count(), 1);
|
|
assert!(graph.find_node("sample").is_none());
|
|
let neighbors = graph.neighbors(idx2);
|
|
assert_eq!(neighbors.len(), 0);
|
|
}
|