use super::*; #[test] fn documentation_heading_positions_preserve_unicode_fences_and_crlf() { let directory = Directory::new(); let root = directory.0.join("app"); dever::compiler::project::create(&root).unwrap(); let path = root.join("module/hello/greeting/doc/greeting.md"); let text = "# 中文说明\r\n\r\n```markdown\r\n## not.a.symbol\r\n```\r\n\r\n## hello.greeting.greet\r\n\r\n真实说明。\r\n"; std::fs::write(path, text).unwrap(); let index = Project::load(&root).unwrap().inspect().unwrap(); assert!(index.documentation_errors.is_empty()); let description = index .documentation .iter() .find(|description| description.symbol == "hello.greeting.greet") .unwrap(); assert_eq!(description.line, 6); assert_eq!(description.markdown, "真实说明。"); } #[test] fn documentation_binds_clauses_without_entering_program_semantics() { let directory = Directory::new(); let root = directory.0.join("app"); dever::compiler::project::create(&root).unwrap(); let path = root.join("module/hello/greeting/doc/greeting.md"); let original = std::fs::read_to_string(&path).unwrap(); let project = Project::load(&root).unwrap(); let before = project.api_snapshot().unwrap(); let index = project.inspect().unwrap(); assert!( index.documentation_errors.is_empty(), "{:?}", index.documentation_errors ); let symbol = index .symbols .iter() .find(|symbol| symbol.name == "hello.greeting.greet") .unwrap(); assert_eq!(symbol.signatures, ["greet(name: Text) (message: Text)"]); let description = index .documentation .iter() .find(|doc| doc.symbol == symbol.name) .unwrap(); assert!(description.markdown.contains("按原样保留")); assert_eq!( index.documentation_files[description.file].path, path.to_string_lossy() ); std::fs::write( &path, format!("{original}\n```markdown\n## not.a.symbol\n```\n\n> ## quoted.symbol\n\n- Nested\n\n ## nested.symbol\n"), ) .unwrap(); assert!(project.inspect().unwrap().documentation_errors.is_empty()); std::fs::write( &path, format!("{original}\n## hello.greeting.missing\n\n过期说明。\n"), ) .unwrap(); let changed = project.inspect().unwrap(); assert!( changed .documentation_errors .iter() .any(|error| error.contains("hello.greeting.missing")) ); assert_eq!(project.api_snapshot().unwrap(), before); project.check().unwrap(); std::fs::write(&path, original).unwrap(); std::fs::write( root.join("module/hello/greeting/doc/duplicate.md"), "## hello.greeting.greet\n\n重复。\n", ) .unwrap(); let duplicate = project.inspect().unwrap(); assert!( duplicate .documentation_errors .iter() .any(|error| error.contains("duplicate documentation")) ); assert!( !duplicate .documentation .iter() .any(|doc| doc.symbol == "hello.greeting.greet") ); let output = Command::new(env!("CARGO_BIN_EXE_dever")) .args(["inspect", root.to_str().unwrap(), "--links", "--check"]) .output() .unwrap(); assert!(!output.status.success()); assert!(String::from_utf8_lossy(&output.stderr).contains("duplicate documentation")); } #[test] fn old_source_format_is_rejected_instead_of_silently_skipped() { let directory = Directory::new(); let root = directory.0.join("app"); dever::compiler::project::create(&root).unwrap(); let path = root.join("module/hello/greeting/domain.dever.md"); std::fs::write(&path, "# Old source\n\n```dever\nunused() () {}\n```\n").unwrap(); assert!(Project::load(&root).err().unwrap().contains("doc/")); assert!(Project::load(&path).err().unwrap().contains("project root")); assert!( dever::compiler::format::project(&root, true) .unwrap_err() .contains("doc/") ); }