Skip to content

Commit b7b4814

Browse files
committed
bender-slang: Add unit and integration tests
1 parent eb84b85 commit b7b4814

9 files changed

Lines changed: 110 additions & 0 deletions

File tree

crates/bender-slang/tests/basic.rs

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
use std::path::PathBuf;
2+
3+
fn fixture_path(rel: &str) -> String {
4+
PathBuf::from(env!("CARGO_MANIFEST_DIR"))
5+
.join("../..")
6+
.join("tests/pickle")
7+
.join(rel)
8+
.canonicalize()
9+
.expect("valid fixture path")
10+
.to_string_lossy()
11+
.into_owned()
12+
}
13+
14+
#[test]
15+
fn parse_valid_file_succeeds() {
16+
let mut session = bender_slang::SlangSession::new();
17+
let files = vec![fixture_path("src/top.sv")];
18+
let includes = vec![fixture_path("include")];
19+
let defines = vec![];
20+
assert!(session.parse_group(&files, &includes, &defines).is_ok());
21+
assert_eq!(session.tree_count(), 1);
22+
}
23+
24+
#[test]
25+
fn parse_invalid_file_returns_parse_error() {
26+
let mut session = bender_slang::SlangSession::new();
27+
let files = vec![fixture_path("src/broken.sv")];
28+
let includes = vec![];
29+
let defines = vec![];
30+
let result = session.parse_group(&files, &includes, &defines);
31+
32+
match result {
33+
Err(bender_slang::SlangError::ParseGroup { .. }) => {}
34+
Err(other) => panic!("expected SlangError::ParseGroup, got {other}"),
35+
Ok(_) => panic!("expected parse to fail"),
36+
}
37+
}
38+
39+
#[test]
40+
fn rewriter_build_from_trees_is_repeatable() {
41+
let mut session = bender_slang::SlangSession::new();
42+
let files = vec![fixture_path("src/top.sv")];
43+
let includes = vec![fixture_path("include")];
44+
let defines = vec![];
45+
session
46+
.parse_group(&files, &includes, &defines)
47+
.expect("parse should succeed");
48+
49+
let trees = session.all_trees().expect("tree collection should succeed");
50+
let tree = trees.first().expect("one tree expected");
51+
52+
let mut rewriter = bender_slang::SyntaxTreeRewriter::new();
53+
rewriter.set_prefix("p_");
54+
rewriter.set_suffix("_s");
55+
rewriter.build_rename_map(&trees);
56+
let renamed_once = rewriter.rewrite_tree(tree);
57+
assert!(
58+
renamed_once
59+
.display(bender_slang::SlangPrintOpts {
60+
expand_macros: false,
61+
include_directives: true,
62+
include_comments: true,
63+
squash_newlines: false,
64+
})
65+
.contains("module p_top_s (")
66+
);
67+
68+
// Rebuilding with the same trees should remain stable.
69+
rewriter.build_rename_map(&trees);
70+
let renamed_twice = rewriter.rewrite_tree(tree);
71+
assert!(
72+
renamed_twice
73+
.display(bender_slang::SlangPrintOpts {
74+
expand_macros: false,
75+
include_directives: true,
76+
include_comments: true,
77+
squash_newlines: false,
78+
})
79+
.contains("module p_top_s (")
80+
);
81+
}

tests/cli_regression.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,5 +161,8 @@ regression_tests! {
161161
packages: &["packages"],
162162
packages_graph: &["packages", "--graph"],
163163
packages_flat: &["packages", "--flat"],
164+
// Enable once the golden binary is built with `slang` support.
165+
// pickle_basic: &["pickle", "--target", "top"],
166+
// pickle_top_trim: &["pickle", "--target", "top", "--top", "top"],
164167

165168
}

tests/pickle/include/macros.svh

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,9 @@
22
`define LOG(msg) \
33
$display("[LOG]: %s", msg);
44

5+
// Macro that references a package symbol; pickle renaming should update this.
6+
`define PKG_IS_ERROR(sig) \
7+
common_pkg::is_error(sig)
8+
59
// A constant used in the RTL
610
localparam int unsigned DataWidth = 32;

tests/pickle/src/broken.sv

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
module broken(;
2+
endmodule

tests/pickle/src/core.sv

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module core;
2+
leaf u_leaf();
3+
endmodule

tests/pickle/src/leaf.sv

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
module leaf;
2+
endmodule

tests/pickle/src/top.sv

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ module top (
77
input logic rst_n
88
);
99

10+
core u_core();
11+
1012
// Interface Instantiation
1113
bus_intf #(.WIDTH(DATA_WIDTH)) axi_bus (
1214
.clk(clk)
@@ -25,12 +27,20 @@ module top (
2527

2628
// Type Usage from Package (state_t)
2729
common_pkg::state_t current_state;
30+
logic macro_error;
31+
32+
// Undefined dependency references must not be renamed.
33+
undefined_pkg::undefined_t ext_state;
34+
undefined_mod u_ext_mod();
35+
virtual undefined_intf ext_if;
2836

2937
always_ff @(posedge clk or negedge rst_n) begin
3038
if (!rst_n) begin
3139
current_state <= Idle;
40+
macro_error <= 1'b0;
3241
end else begin
3342
current_state <= Busy;
43+
macro_error <= `PKG_IS_ERROR(current_state);
3444
end
3545
end
3646

tests/pickle/src/unused_leaf.sv

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
module unused_leaf;
2+
endmodule

tests/pickle/src/unused_top.sv

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module unused_top;
2+
unused_leaf u_unused_leaf();
3+
endmodule

0 commit comments

Comments
 (0)