mirror of
https://github.com/denoland/deno.git
synced 2025-03-03 17:34:47 -05:00
feat(test): Add support for regex in filter flag (#6343)
Currently, the documentation makes it sound like the test subcommand's filter flag could accept some kind of pattern matching value like a glob or a regex, although the function "createFilterFn" accepts a regex as an argument, there's no way to pass an actual regex value from the CLI. This commit makes it possible to pass a string that could be cast as regex when string matches "^/.*/$". With this change, a user can use the filter flag as follow: deno test --filter "/test-.+/" Also tested that `\` get escaped properly, on MacOS at least, and this is also a valid flag: deno test --filter "/test-\d+/"
This commit is contained in:
parent
14a44464a6
commit
4534db656d
5 changed files with 84 additions and 3 deletions
|
@ -1105,7 +1105,7 @@ fn test_subcommand<'a, 'b>() -> App<'a, 'b> {
|
||||||
Arg::with_name("filter")
|
Arg::with_name("filter")
|
||||||
.long("filter")
|
.long("filter")
|
||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.help("Run tests with this string in the test name"),
|
.help("Run tests with this string or pattern in the test name"),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("files")
|
Arg::with_name("files")
|
||||||
|
|
|
@ -308,6 +308,9 @@ function createFilterFn(
|
||||||
if (filter) {
|
if (filter) {
|
||||||
if (filter instanceof RegExp) {
|
if (filter instanceof RegExp) {
|
||||||
passes = passes && filter.test(def.name);
|
passes = passes && filter.test(def.name);
|
||||||
|
} else if (filter.startsWith("/") && filter.endsWith("/")) {
|
||||||
|
const filterAsRegex = new RegExp(filter.slice(1, filter.length - 1));
|
||||||
|
passes = passes && filterAsRegex.test(def.name);
|
||||||
} else {
|
} else {
|
||||||
passes = passes && def.name.includes(filter);
|
passes = passes && def.name.includes(filter);
|
||||||
}
|
}
|
||||||
|
@ -325,6 +328,8 @@ function createFilterFn(
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
exposeForTest("createFilterFn", createFilterFn);
|
||||||
|
|
||||||
interface RunTestsOptions {
|
interface RunTestsOptions {
|
||||||
exitOnFail?: boolean;
|
exitOnFail?: boolean;
|
||||||
failFast?: boolean;
|
failFast?: boolean;
|
||||||
|
|
52
cli/tests/unit/filter_function_test.ts
Normal file
52
cli/tests/unit/filter_function_test.ts
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
import { unitTest, assertEquals } from "./test_util.ts";
|
||||||
|
|
||||||
|
// @ts-expect-error TypeScript (as of 3.7) does not support indexing namespaces by symbol
|
||||||
|
const { createFilterFn } = Deno[Deno.internal];
|
||||||
|
|
||||||
|
unitTest(function filterAsString(): void {
|
||||||
|
const filterFn = createFilterFn("my-test");
|
||||||
|
const tests = [
|
||||||
|
{
|
||||||
|
fn(): void {},
|
||||||
|
name: "my-test",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fn(): void {},
|
||||||
|
name: "other-test",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const filteredTests = tests.filter(filterFn);
|
||||||
|
assertEquals(filteredTests.length, 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
unitTest(function filterAsREGEX(): void {
|
||||||
|
const filterFn = createFilterFn("/.+-test/");
|
||||||
|
const tests = [
|
||||||
|
{
|
||||||
|
fn(): void {},
|
||||||
|
name: "my-test",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fn(): void {},
|
||||||
|
name: "other-test",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const filteredTests = tests.filter(filterFn);
|
||||||
|
assertEquals(filteredTests.length, 2);
|
||||||
|
});
|
||||||
|
|
||||||
|
unitTest(function filterAsEscapedREGEX(): void {
|
||||||
|
const filterFn = createFilterFn("/\\w+-test/");
|
||||||
|
const tests = [
|
||||||
|
{
|
||||||
|
fn(): void {},
|
||||||
|
name: "my-test",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fn(): void {},
|
||||||
|
name: "other-test",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const filteredTests = tests.filter(filterFn);
|
||||||
|
assertEquals(filteredTests.length, 2);
|
||||||
|
});
|
|
@ -24,6 +24,7 @@ import "./event_target_test.ts";
|
||||||
import "./fetch_test.ts";
|
import "./fetch_test.ts";
|
||||||
import "./file_test.ts";
|
import "./file_test.ts";
|
||||||
import "./files_test.ts";
|
import "./files_test.ts";
|
||||||
|
import "./filter_function_test.ts";
|
||||||
import "./form_data_test.ts";
|
import "./form_data_test.ts";
|
||||||
import "./format_error_test.ts";
|
import "./format_error_test.ts";
|
||||||
import "./fs_events_test.ts";
|
import "./fs_events_test.ts";
|
||||||
|
|
|
@ -129,10 +129,33 @@ There are a number of options to filter the tests you are running.
|
||||||
Tests can be run individually or in groups using the command line `--filter`
|
Tests can be run individually or in groups using the command line `--filter`
|
||||||
option.
|
option.
|
||||||
|
|
||||||
```shell
|
The filter flags accept a string or a pattern as value.
|
||||||
deno test --filter "hello world" tests/
|
|
||||||
|
Assuming the following tests:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
Deno.test({ name: "my-test", fn: myTest });
|
||||||
|
Deno.test({ name: "test-1", fn: test1 });
|
||||||
|
Deno.test({ name: "test2", fn: test2 });
|
||||||
```
|
```
|
||||||
|
|
||||||
|
This command will run all of these tests because they all contain the word
|
||||||
|
"test".
|
||||||
|
|
||||||
|
```shell
|
||||||
|
deno test --filter "test" tests/
|
||||||
|
```
|
||||||
|
|
||||||
|
On the flip side, the following command uses a pattern and will run the second
|
||||||
|
and third tests.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
deno test --filter "/test-*\d/" tests/
|
||||||
|
```
|
||||||
|
|
||||||
|
_To let Deno know that you want to use a pattern, wrap your filter with
|
||||||
|
forward-slashes like the JavaScript syntactic sugar for a REGEX._
|
||||||
|
|
||||||
This command will run any test which contains the string "hello world" in its
|
This command will run any test which contains the string "hello world" in its
|
||||||
test name for tests found within files in the `tests/` directory.
|
test name for tests found within files in the `tests/` directory.
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue