完成 vhdl 的 UT

This commit is contained in:
锦恢 2024-10-01 21:29:55 +08:00
parent 1308a35546
commit 0a1eb5e080
5 changed files with 76 additions and 2 deletions

View File

@ -89,7 +89,7 @@ fn make_textdocumenitem_from_path(path_buf: &PathBuf) -> Option<TextDocumentItem
/// 前端交互接口: do_fast输入文件路径计算出对应的 fast 结构
pub fn do_fast<'a>(path: String, backend: &Arc<Backend>) -> Result<FastHdlparam> {
info!("parse fast {}", path);
info!("parse fast \"{}\"", path);
let language_id = get_language_id_by_path_str(&path);
match language_id.as_str() {

View File

@ -1,3 +1,5 @@
mod vhdl;
#[allow(unused)]
const TESTFILES_DIR: &str = "testfiles";
@ -10,6 +12,8 @@ const TEST_FILE: &str = "/home/dide/project/Digital-Test/MipsDesign/src/MyCpu.v"
#[allow(unused)]
const INCOMPLETE_EXAMPLE: &str = "/home/dide/project/Digital-Test/Digital-IDE-test/user/src/incomplete-example";
#[allow(unused)]
const TESTFILES_TEMP_DIR: &str = "/home/dide/project/Digital-Test/Digital-IDE-temp";
#[allow(unused)]
macro_rules! unwrap_result {

26
src/test/vhdl.rs Normal file
View File

@ -0,0 +1,26 @@
#[cfg(test)]
mod test_vhdl_fast {
use crate::{core::vhdl_parser::{make_fast_from_design_file, vhdl_parse}, test::TESTFILES_TEMP_DIR, utils::*};
#[test]
fn test_temp() {
let file_iter = RecursiveFileIterator::new(TESTFILES_TEMP_DIR);
for file in file_iter {
let language_id = get_language_id_by_pathbuf(&file);
if language_id == "vhdl" {
println!("test file: {:?}", file);
if let Some(design_file) = vhdl_parse(&file) {
if let Some(_) = make_fast_from_design_file(&design_file) {
println!("");
} else {
eprintln!("error happen when make fast {:?}", file);
}
} else {
eprintln!("error happen when parse {:?}", file);
}
}
}
}
}

View File

@ -1,4 +1,4 @@
use std::{fs, path::PathBuf};
use std::{fs, path::PathBuf, str::FromStr};
use log::info;
use ropey::Rope;
@ -28,4 +28,36 @@ pub fn open_doc_as_rope(path: &PathBuf) -> Option<Rope> {
} else {
None
}
}
pub struct RecursiveFileIterator {
stack: Vec<PathBuf>,
}
impl RecursiveFileIterator {
pub fn new(start_dir: &str) -> Self {
let start_dir = PathBuf::from_str(start_dir).unwrap();
RecursiveFileIterator {
stack: vec![start_dir],
}
}
}
impl Iterator for RecursiveFileIterator {
type Item = PathBuf;
fn next(&mut self) -> Option<Self::Item> {
while let Some(path) = self.stack.pop() {
if path.is_dir() {
if let Ok(entries) = fs::read_dir(path) {
for entry in entries.flatten() {
self.stack.push(entry.path());
}
}
} else {
return Some(path);
}
}
None
}
}

View File

@ -8,6 +8,7 @@ use vhdl_lang::{ast::ObjectClass, AnyEntKind, Concurrent, Object, Overloaded, Sr
pub mod fast;
pub mod file;
pub use file::*;
/// 根据 pos 获取到当前光标所在的字符串,相当于 getWordRangeAtPosition
pub fn get_definition_token(line: &RopeSlice, pos: Position) -> String {
@ -91,6 +92,17 @@ pub fn get_language_id_by_uri(uri: &Url) -> String {
get_language_id_by_extname(ext_name)
}
/// 根据路径字符串获取 hdl 的 language id
/// 返回值为 "vhdl" | "verilog" | "systemverilog" | "plaintext"
/// 不采用枚举是因为需要在 lsp 中使用到它们的字符串值
pub fn get_language_id_by_pathbuf(pathbuf: &PathBuf) -> String {
let ext_name = pathbuf.as_path()
.extension()
.and_then(std::ffi::OsStr::to_str)
.unwrap_or("");
get_language_id_by_extname(ext_name)
}
/// 根据路径字符串获取 hdl 的 language id
/// 返回值为 "vhdl" | "verilog" | "systemverilog" | "plaintext"
/// 不采用枚举是因为需要在 lsp 中使用到它们的字符串值