summaryrefslogtreecommitdiff
path: root/cli/doc/tests.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/doc/tests.rs')
-rw-r--r--cli/doc/tests.rs220
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)")
+ );
+}