diff options
Diffstat (limited to 'cli/doc/tests.rs')
-rw-r--r-- | cli/doc/tests.rs | 220 |
1 files changed, 175 insertions, 45 deletions
diff --git a/cli/doc/tests.rs b/cli/doc/tests.rs index 9432ba095..337f32466 100644 --- a/cli/doc/tests.rs +++ b/cli/doc/tests.rs @@ -4,8 +4,47 @@ use crate::colors; use serde_json; use serde_json::json; -#[test] -fn export_fn() { +use super::parser::DocFileLoader; +use crate::op_error::OpError; +use std::collections::HashMap; + +use futures::Future; +use futures::FutureExt; +use std::pin::Pin; + +pub struct TestLoader { + files: HashMap<String, String>, +} + +impl TestLoader { + pub fn new(files_vec: Vec<(String, String)>) -> Box<Self> { + let mut files = HashMap::new(); + + for file_tuple in files_vec { + files.insert(file_tuple.0, file_tuple.1); + } + + Box::new(Self { files }) + } +} + +impl DocFileLoader for TestLoader { + fn load_source_code( + &self, + specifier: &str, + ) -> Pin<Box<dyn Future<Output = Result<String, OpError>>>> { + eprintln!("specifier {:#?}", specifier); + let res = match self.files.get(specifier) { + Some(source_code) => Ok(source_code.to_string()), + None => Err(OpError::other("not found".to_string())), + }; + + async move { res }.boxed_local() + } +} + +#[tokio::test] +async fn export_fn() { let source_code = r#"/** * Hello there, this is a multiline JSdoc. * @@ -17,9 +56,9 @@ export function foo(a: string, b: number): void { console.log("Hello world"); } "#; - let entries = DocParser::default() - .parse("test.ts".to_string(), source_code.to_string()) - .unwrap(); + let loader = + TestLoader::new(vec![("test.ts".to_string(), source_code.to_string())]); + let entries = DocParser::new(loader).parse("test.ts").await.unwrap(); assert_eq!(entries.len(), 1); let entry = &entries[0]; let expected_json = json!({ @@ -68,13 +107,13 @@ export function foo(a: string, b: number): void { ); } -#[test] -fn export_const() { +#[tokio::test] +async fn export_const() { let source_code = "/** Something about fizzBuzz */\nexport const fizzBuzz = \"fizzBuzz\";\n"; - let entries = DocParser::default() - .parse("test.ts".to_string(), source_code.to_string()) - .unwrap(); + let loader = + TestLoader::new(vec![("test.ts".to_string(), source_code.to_string())]); + let entries = DocParser::new(loader).parse("test.ts").await.unwrap(); assert_eq!(entries.len(), 1); let entry = &entries[0]; let expected_json = json!({ @@ -100,8 +139,8 @@ fn export_const() { ); } -#[test] -fn export_class() { +#[tokio::test] +async fn export_class() { let source_code = r#" /** Class doc */ export class Foobar extends Fizz implements Buzz, Aldrin { @@ -124,9 +163,9 @@ export class Foobar extends Fizz implements Buzz, Aldrin { } } "#; - let entries = DocParser::default() - .parse("test.ts".to_string(), source_code.to_string()) - .unwrap(); + let loader = + TestLoader::new(vec![("test.ts".to_string(), source_code.to_string())]); + let entries = DocParser::new(loader).parse("test.ts").await.unwrap(); assert_eq!(entries.len(), 1); let expected_json = json!({ "kind": "class", @@ -314,8 +353,8 @@ export class Foobar extends Fizz implements Buzz, Aldrin { ); } -#[test] -fn export_interface() { +#[tokio::test] +async fn export_interface() { let source_code = r#" /** * Interface js doc @@ -325,9 +364,9 @@ export interface Reader { read(buf: Uint8Array, something: unknown): Promise<number> } "#; - let entries = DocParser::default() - .parse("test.ts".to_string(), source_code.to_string()) - .unwrap(); + let loader = + TestLoader::new(vec![("test.ts".to_string(), source_code.to_string())]); + let entries = DocParser::new(loader).parse("test.ts").await.unwrap(); assert_eq!(entries.len(), 1); let entry = &entries[0]; let expected_json = json!({ @@ -399,15 +438,15 @@ export interface Reader { ); } -#[test] -fn export_type_alias() { +#[tokio::test] +async fn export_type_alias() { let source_code = r#" /** Array holding numbers */ export type NumberArray = Array<number>; "#; - let entries = DocParser::default() - .parse("test.ts".to_string(), source_code.to_string()) - .unwrap(); + let loader = + TestLoader::new(vec![("test.ts".to_string(), source_code.to_string())]); + let entries = DocParser::new(loader).parse("test.ts").await.unwrap(); assert_eq!(entries.len(), 1); let entry = &entries[0]; let expected_json = json!({ @@ -445,8 +484,8 @@ export type NumberArray = Array<number>; ); } -#[test] -fn export_enum() { +#[tokio::test] +async fn export_enum() { let source_code = r#" /** * Some enum for good measure @@ -457,9 +496,9 @@ export enum Hello { Buzz = "buzz", } "#; - let entries = DocParser::default() - .parse("test.ts".to_string(), source_code.to_string()) - .unwrap(); + let loader = + TestLoader::new(vec![("test.ts".to_string(), source_code.to_string())]); + let entries = DocParser::new(loader).parse("test.ts").await.unwrap(); assert_eq!(entries.len(), 1); let entry = &entries[0]; let expected_json = json!({ @@ -498,8 +537,8 @@ export enum Hello { ); } -#[test] -fn export_namespace() { +#[tokio::test] +async fn export_namespace() { let source_code = r#" /** Namespace JSdoc */ export namespace RootNs { @@ -515,9 +554,9 @@ export namespace RootNs { } } "#; - let entries = DocParser::default() - .parse("test.ts".to_string(), source_code.to_string()) - .unwrap(); + let loader = + TestLoader::new(vec![("test.ts".to_string(), source_code.to_string())]); + let entries = DocParser::new(loader).parse("test.ts").await.unwrap(); assert_eq!(entries.len(), 1); let entry = &entries[0]; let expected_json = json!({ @@ -593,8 +632,8 @@ export namespace RootNs { ); } -#[test] -fn declare_namespace() { +#[tokio::test] +async fn declare_namespace() { let source_code = r#" /** Namespace JSdoc */ declare namespace RootNs { @@ -610,9 +649,9 @@ declare namespace RootNs { } } "#; - let entries = DocParser::default() - .parse("test.ts".to_string(), source_code.to_string()) - .unwrap(); + let loader = + TestLoader::new(vec![("test.ts".to_string(), source_code.to_string())]); + let entries = DocParser::new(loader).parse("test.ts").await.unwrap(); assert_eq!(entries.len(), 1); let entry = &entries[0]; let expected_json = json!({ @@ -687,16 +726,16 @@ declare namespace RootNs { .contains("namespace RootNs") ); } -#[test] -fn optional_return_type() { +#[tokio::test] +async fn optional_return_type() { let source_code = r#" export function foo(a: number) { return a; } "#; - let entries = DocParser::default() - .parse("test.ts".to_string(), source_code.to_string()) - .unwrap(); + let loader = + TestLoader::new(vec![("test.ts".to_string(), source_code.to_string())]); + let entries = DocParser::new(loader).parse("test.ts").await.unwrap(); assert_eq!(entries.len(), 1); let entry = &entries[0]; let expected_json = json!({ @@ -732,3 +771,94 @@ fn optional_return_type() { .contains("function foo(a: number)") ); } + +#[tokio::test] +async fn reexports() { + let nested_reexport_source_code = r#" +/** + * JSDoc for bar + */ +export const bar = "bar"; +"#; + let reexport_source_code = r#" +import { bar } from "./nested_reexport.ts"; + +/** + * JSDoc for const + */ +export const foo = "foo"; +"#; + let test_source_code = r#" +export { foo as fooConst } from "./reexport.ts"; + +/** JSDoc for function */ +export function fooFn(a: number) { + return a; +} +"#; + let loader = TestLoader::new(vec![ + ("file:///test.ts".to_string(), test_source_code.to_string()), + ( + "file:///reexport.ts".to_string(), + reexport_source_code.to_string(), + ), + ( + "file:///nested_reexport.ts".to_string(), + nested_reexport_source_code.to_string(), + ), + ]); + let entries = DocParser::new(loader) + .parse_with_reexports("file:///test.ts") + .await + .unwrap(); + assert_eq!(entries.len(), 2); + + let expected_json = json!([ + { + "kind": "variable", + "name": "fooConst", + "location": { + "filename": "file:///reexport.ts", + "line": 7, + "col": 0 + }, + "jsDoc": "JSDoc for const", + "variableDef": { + "tsType": null, + "kind": "const" + } + }, + { + "kind": "function", + "name": "fooFn", + "location": { + "filename": "file:///test.ts", + "line": 5, + "col": 0 + }, + "jsDoc": "JSDoc for function", + "functionDef": { + "params": [ + { + "name": "a", + "tsType": { + "keyword": "number", + "kind": "keyword", + "repr": "number", + }, + } + ], + "returnType": null, + "isAsync": false, + "isGenerator": false + } + } + ]); + let actual = serde_json::to_value(entries.clone()).unwrap(); + assert_eq!(actual, expected_json); + + assert!( + colors::strip_ansi_codes(super::printer::format(entries).as_str()) + .contains("function fooFn(a: number)") + ); +} |