use super::tools::{create_reasoner_from_engine, print_outputs, ENGINE_DEV};
use crate::{expectation_tests, language::Term};
use narsese::{api::GetTerm, conversion::string::impl_lexical::format_instances::FORMAT_ASCII};
use navm::output::Output;
expectation_tests! {
bug_20240819_intro_var_inner_loop_substitute: {
"
nse <<A --> (*, $1, $2)> ==> <A --> [$1, $2]>>.
nse <A --> (*, B, C)>.
nse <A --> (*, B, B)>.
nse <A --> [B, C]>?
nse <A --> [B]>?
cyc 20
"
=> ANSWER "<A --> [B]>" in outputs
}
bug_20240819_intro_var_inner_another_example: {
"
vol 99
nse <<A --> [$1, $2]> ==> <A --> (*, $1, $2)>>.
nse <A --> [B, C]>.
nse <A --> [B]>.
nse <A --> (*, B, C)>?
rem ↓下面这个不行
nse <A --> (*, B, B)>?
cyc 1000
"
=> ANSWER "<A --> (*, B, C)>" in outputs
}
#[ignore = "堆栈溢出类测试 运行时间过长,不便加入cargo test中"]
issue_001_20240824_apply_substitute_infinite_recurse: {
"
nse <{P1} --> P>.
nse <{L1} --> L>.
nse <{A1} --> A>.
nse <{O1} --> O>.
nse <(*, {A1}, {P1}) -->IN>.
nse <(*, {O1}, {L1}) --> IN>.
nse <(*, {A1}, {O1}) --> Hb>.
nse <(*, {P1}, {L1}) --> Bind>.
nse <{P2} --> P>.
nse <{L2} --> L>.
nse <{A2} --> A>.
nse <{O2} --> O>.
nse <(*, {A2}, {P2}) --> IN>.
nse <(*, {O2}, {L2}) --> IN>.
nse <(*, {A2}, {O2}) --> Hb>.
nse <(*, {P2}, {L1}) --> Bind>?
nse <(*, {P1}, {L2}) --> Bind>?
nse <(*, {P2}, {L2}) --> Bind>?
cyc 6000
"
=> ANSWER "<(*, {P1}, {L2}) --> Bind>" in outputs }
}
#[test]
fn bug_20240908_intro_var_inner_invalid_statement() {
let mut vm = create_reasoner_from_engine(ENGINE_DEV);
let outputs = vm.input_cmds_and_fetch_out(
"
nse <<$1 --> B> ==> <$1 --> A>>.
nse <A --> C>.
cyc 5
",
);
print_outputs(&outputs);
for narsese_lexical in outputs
.iter()
.flat_map(Output::get_narsese)
.map(GetTerm::get_term)
.cloned()
{
let str_ascii = FORMAT_ASCII.format(&narsese_lexical);
if let Err(e) = Term::from_lexical(narsese_lexical) {
eprintln!("推理器产生了无效的内部输出 {str_ascii:?}:{e}")
}
}
}