|
| 1 | +//! Solidity 六类别真实工具验收 |
| 2 | +//! 验收标准:正例通过 + 负例检出 + 格式≠注释合规 |
| 3 | +
|
| 4 | +use std::process::Command; |
| 5 | + |
| 6 | +fn ensure_clean_dir(name: &str) -> std::path::PathBuf { |
| 7 | + let tmp = std::env::temp_dir().join(name); |
| 8 | + let _ = std::fs::remove_dir_all(&tmp); |
| 9 | + std::fs::create_dir_all(&tmp).unwrap(); |
| 10 | + tmp |
| 11 | +} |
| 12 | + |
| 13 | +fn solc_bin() -> String { |
| 14 | + std::env::var("CODEGUARD_SOLC_BIN").unwrap_or_else(|_| "solc".to_string()) |
| 15 | +} |
| 16 | + |
| 17 | +/// 正例通过 |
| 18 | +#[test] |
| 19 | +fn valid_solidity_samples_pass_compile() { |
| 20 | + let tmp = ensure_clean_dir("solidity-valid-test"); |
| 21 | + std::fs::write(tmp.join("main.sol"), "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// Adds two numbers.\ncontract Calculator {\n function add(uint256 a, uint256 b) public pure returns (uint256) {\n return a + b;\n }\n}\n").unwrap(); |
| 22 | + |
| 23 | + let output = Command::new(solc_bin()) |
| 24 | + .args(["--bin", "main.sol"]) |
| 25 | + .current_dir(&tmp) |
| 26 | + .output() |
| 27 | + .expect("solc 不可用"); |
| 28 | + |
| 29 | + assert!(output.status.success(), "有效 Solidity 代码应通过编译: {:?}", output); |
| 30 | + std::fs::remove_dir_all(&tmp).unwrap(); |
| 31 | +} |
| 32 | + |
| 33 | +/// 负例检出 |
| 34 | +#[test] |
| 35 | +fn invalid_solidity_samples_are_detected() { |
| 36 | + let tmp = ensure_clean_dir("solidity-invalid-test"); |
| 37 | + std::fs::write(tmp.join("main.sol"), "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ncontract Broken {\n function broken(uint256 a, uint256 b) public pure returns (uint256) {\n return a + b + notDefinedAnywhere;\n }\n}\n").unwrap(); |
| 38 | + |
| 39 | + let output = Command::new(solc_bin()) |
| 40 | + .args(["--bin", "main.sol"]) |
| 41 | + .current_dir(&tmp) |
| 42 | + .output() |
| 43 | + .expect("solc 不可用"); |
| 44 | + |
| 45 | + assert!(!output.status.success(), "未定义变量应被检出"); |
| 46 | + std::fs::remove_dir_all(&tmp).unwrap(); |
| 47 | +} |
| 48 | + |
| 49 | +/// 格式≠注释合规 |
| 50 | +#[test] |
| 51 | +fn formatting_cannot_impersonate_comment_checking() { |
| 52 | + let tmp = ensure_clean_dir("solidity-comment-test"); |
| 53 | + // 格式正确但缺少注释 |
| 54 | + std::fs::write(tmp.join("main.sol"), "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ncontract Undocumented {\n function undocumented(uint256 a) public pure returns (uint256) {\n return a * 2;\n }\n}\n\n/// Has docs.\ncontract Documented {\n function documented(uint256 a) public pure returns (uint256) {\n return a + 1;\n }\n}\n").unwrap(); |
| 55 | + |
| 56 | + let output = Command::new(solc_bin()) |
| 57 | + .args(["--bin", "main.sol"]) |
| 58 | + .current_dir(&tmp) |
| 59 | + .output() |
| 60 | + .expect("solc 不可用"); |
| 61 | + |
| 62 | + assert!(output.status.success(), "Solidity 应通过(语法正确),但注释合规需另查: {:?}", output); |
| 63 | + std::fs::remove_dir_all(&tmp).unwrap(); |
| 64 | +} |
0 commit comments