mirror of
https://github.com/danbulant/oxc
synced 2026-05-24 12:21:58 +00:00
feat(linter) add support for custom filenames in tests (#1955)
This commit is contained in:
parent
18d1c29a62
commit
d9ca086eb6
9 changed files with 222 additions and 170 deletions
|
|
@ -192,44 +192,49 @@ fn test() {
|
|||
}
|
||||
|
||||
let pass = vec![
|
||||
("<div />", None, None),
|
||||
("<div></div>", None, None),
|
||||
("<div role={role} />", None, None),
|
||||
("<div role={role || 'button'} />", None, None),
|
||||
("<div role={role || 'foobar'} />", None, None),
|
||||
("<div role='tabpanel row' />", None, None),
|
||||
("<div role='switch' />", None, None),
|
||||
("<div role='doc-abstract' />", None, None),
|
||||
("<div role='doc-appendix doc-bibliography' />", None, None),
|
||||
("<Bar baz />", None, None),
|
||||
("<img role='invalid-role' />", Some(allowed_invalid_roles()), None),
|
||||
("<img role='invalid-role tabpanel' />", Some(allowed_invalid_roles()), None),
|
||||
("<img role='invalid-role other-invalid-role' />", Some(allowed_invalid_roles()), None),
|
||||
("<Foo role='bar' />", Some(ignore_non_dom_schema()), None),
|
||||
("<fakeDOM role='bar' />", Some(ignore_non_dom_schema()), None),
|
||||
("<img role='presentation' />", Some(ignore_non_dom_schema()), None),
|
||||
("<Div role='button' />", None, Some(settings())),
|
||||
("<Box asChild='div' role='button' />", None, Some(settings())),
|
||||
("<svg role='graphics-document document' />", None, None),
|
||||
("<div />", None, None, None),
|
||||
("<div></div>", None, None, None),
|
||||
("<div role={role} />", None, None, None),
|
||||
("<div role={role || 'button'} />", None, None, None),
|
||||
("<div role={role || 'foobar'} />", None, None, None),
|
||||
("<div role='tabpanel row' />", None, None, None),
|
||||
("<div role='switch' />", None, None, None),
|
||||
("<div role='doc-abstract' />", None, None, None),
|
||||
("<div role='doc-appendix doc-bibliography' />", None, None, None),
|
||||
("<Bar baz />", None, None, None),
|
||||
("<img role='invalid-role' />", Some(allowed_invalid_roles()), None, None),
|
||||
("<img role='invalid-role tabpanel' />", Some(allowed_invalid_roles()), None, None),
|
||||
(
|
||||
"<img role='invalid-role other-invalid-role' />",
|
||||
Some(allowed_invalid_roles()),
|
||||
None,
|
||||
None,
|
||||
),
|
||||
("<Foo role='bar' />", Some(ignore_non_dom_schema()), None, None),
|
||||
("<fakeDOM role='bar' />", Some(ignore_non_dom_schema()), None, None),
|
||||
("<img role='presentation' />", Some(ignore_non_dom_schema()), None, None),
|
||||
("<Div role='button' />", None, Some(settings()), None),
|
||||
("<Box asChild='div' role='button' />", None, Some(settings()), None),
|
||||
("<svg role='graphics-document document' />", None, None, None),
|
||||
];
|
||||
|
||||
let fail = vec![
|
||||
("<div role='foobar' />", None, None),
|
||||
("<div role='datepicker'></div>", None, None),
|
||||
("<div role='range'></div>", None, None),
|
||||
("<div role='Button'></div>", None, None),
|
||||
("<div role='></div>", None, None),
|
||||
("<div role='tabpanel row foobar'></div>", None, None),
|
||||
("<div role='tabpanel row range'></div>", None, None),
|
||||
("<div role='doc-endnotes range'></div>", None, None),
|
||||
("<div role />", None, None),
|
||||
("<div role='unknown-invalid-role' />", Some(allowed_invalid_roles()), None),
|
||||
("<div role={null}></div>", None, None),
|
||||
("<Foo role='datepicker' />", None, None),
|
||||
("<Foo role='Button' />", None, None),
|
||||
("<Div role='Button' />", None, Some(settings())),
|
||||
("<Div role='Button' />", Some(ignore_non_dom_schema()), Some(settings())),
|
||||
("<Box asChild='div' role='Button' />", None, None),
|
||||
("<div role='foobar' />", None, None, None),
|
||||
("<div role='datepicker'></div>", None, None, None),
|
||||
("<div role='range'></div>", None, None, None),
|
||||
("<div role='Button'></div>", None, None, None),
|
||||
("<div role='></div>", None, None, None),
|
||||
("<div role='tabpanel row foobar'></div>", None, None, None),
|
||||
("<div role='tabpanel row range'></div>", None, None, None),
|
||||
("<div role='doc-endnotes range'></div>", None, None, None),
|
||||
("<div role />", None, None, None),
|
||||
("<div role='unknown-invalid-role' />", Some(allowed_invalid_roles()), None, None),
|
||||
("<div role={null}></div>", None, None, None),
|
||||
("<Foo role='datepicker' />", None, None, None),
|
||||
("<Foo role='Button' />", None, None, None),
|
||||
("<Div role='Button' />", None, Some(settings()), None),
|
||||
("<Div role='Button' />", Some(ignore_non_dom_schema()), Some(settings()), None),
|
||||
("<Box asChild='div' role='Button' />", None, None, None),
|
||||
];
|
||||
|
||||
Tester::new_with_settings(AriaRole::NAME, pass, fail).test_and_snapshot();
|
||||
|
|
|
|||
|
|
@ -111,21 +111,21 @@ fn test() {
|
|||
}
|
||||
|
||||
let pass = vec![
|
||||
(r"<div />;", None, None),
|
||||
(r#"<html lang="en" />"#, None, None),
|
||||
(r#"<html lang="en-US" />"#, None, None),
|
||||
(r"<html lang={foo} />;", None, None),
|
||||
(r"<html lang />;", None, None),
|
||||
(r"<HTML />;", None, None),
|
||||
("<HTMLTop lang='en' />", None, Some(settings())),
|
||||
(r"<div />;", None, None, None),
|
||||
(r#"<html lang="en" />"#, None, None, None),
|
||||
(r#"<html lang="en-US" />"#, None, None, None),
|
||||
(r"<html lang={foo} />;", None, None, None),
|
||||
(r"<html lang />;", None, None, None),
|
||||
(r"<HTML />;", None, None, None),
|
||||
("<HTMLTop lang='en' />", None, Some(settings()), None),
|
||||
];
|
||||
|
||||
let fail = vec![
|
||||
(r"<html />;", None, None),
|
||||
(r"<html {...props} />;", None, None),
|
||||
(r"<html lang={undefined} />;", None, None),
|
||||
(r#"<html lang="" />;"#, None, None),
|
||||
("<HTMLTop />", None, Some(settings())),
|
||||
(r"<html />;", None, None, None),
|
||||
(r"<html {...props} />;", None, None, None),
|
||||
(r"<html lang={undefined} />;", None, None, None),
|
||||
(r#"<html lang="" />;"#, None, None, None),
|
||||
("<HTMLTop />", None, Some(settings()), None),
|
||||
];
|
||||
|
||||
Tester::new_with_settings(HtmlHasLang::NAME, pass, fail)
|
||||
|
|
|
|||
|
|
@ -122,28 +122,28 @@ fn test() {
|
|||
}
|
||||
|
||||
let pass = vec![
|
||||
("<div />;", None, None),
|
||||
("<div foo='bar' />;", None, None),
|
||||
("<div lang='foo' />;", None, None),
|
||||
("<html lang='en' />", None, None),
|
||||
("<html lang='en-US' />", None, None),
|
||||
("<html lang='zh-Hans' />", None, None),
|
||||
("<html lang='zh-Hant-HK' />", None, None),
|
||||
("<html lang='zh-yue-Hant' />", None, None),
|
||||
("<html lang='ja-Latn' />", None, None),
|
||||
("<html lang={foo} />", None, None),
|
||||
("<HTML lang='foo' />", None, None),
|
||||
("<Foo lang={undefined} />", None, None),
|
||||
("<Foo lang='en' />", None, Some(settings())),
|
||||
("<Box as='html' lang='en' />", None, Some(settings())),
|
||||
("<div />;", None, None, None),
|
||||
("<div foo='bar' />;", None, None, None),
|
||||
("<div lang='foo' />;", None, None, None),
|
||||
("<html lang='en' />", None, None, None),
|
||||
("<html lang='en-US' />", None, None, None),
|
||||
("<html lang='zh-Hans' />", None, None, None),
|
||||
("<html lang='zh-Hant-HK' />", None, None, None),
|
||||
("<html lang='zh-yue-Hant' />", None, None, None),
|
||||
("<html lang='ja-Latn' />", None, None, None),
|
||||
("<html lang={foo} />", None, None, None),
|
||||
("<HTML lang='foo' />", None, None, None),
|
||||
("<Foo lang={undefined} />", None, None, None),
|
||||
("<Foo lang='en' />", None, Some(settings()), None),
|
||||
("<Box as='html' lang='en' />", None, Some(settings()), None),
|
||||
];
|
||||
|
||||
let fail = vec![
|
||||
("<html lang='foo' />", None, None),
|
||||
("<html lang='zz-LL' />", None, None),
|
||||
("<html lang={undefined} />", None, None),
|
||||
("<Foo lang={undefined} />", None, Some(settings())),
|
||||
("<Box as='html' lang='foo' />", None, Some(settings())),
|
||||
("<html lang='foo' />", None, None, None),
|
||||
("<html lang='zz-LL' />", None, None, None),
|
||||
("<html lang={undefined} />", None, None, None),
|
||||
("<Foo lang={undefined} />", None, Some(settings()), None),
|
||||
("<Box as='html' lang='foo' />", None, Some(settings()), None),
|
||||
];
|
||||
|
||||
Tester::new_with_settings(Lang::NAME, pass, fail).test_and_snapshot();
|
||||
|
|
|
|||
|
|
@ -200,64 +200,64 @@ fn test() {
|
|||
}
|
||||
|
||||
let pass = vec![
|
||||
(r"<div />;", None, None),
|
||||
(r"<MyDiv />;", None, None),
|
||||
(r"<audio><track kind='captions' /></audio>", None, None),
|
||||
(r"<audio><track kind='Captions' /></audio>", None, None),
|
||||
(r"<audio><track kind='Captions' /><track kind='subtitles' /></audio>", None, None),
|
||||
(r"<video><track kind='captions' /></video>", None, None),
|
||||
(r"<video><track kind='Captions' /></video>", None, None),
|
||||
(r"<video><track kind='Captions' /><track kind='subtitles' /></video>", None, None),
|
||||
(r"<audio muted={true}></audio>", None, None),
|
||||
(r"<video muted={true}></video>", None, None),
|
||||
(r"<video muted></video>", None, None),
|
||||
(r"<Audio><track kind='captions' /></Audio>", Some(config()), None),
|
||||
(r"<audio><Track kind='captions' /></audio>", Some(config()), None),
|
||||
(r"<Video><track kind='captions' /></Video>", Some(config()), None),
|
||||
(r"<video><Track kind='captions' /></video>", Some(config()), None),
|
||||
(r"<Audio><Track kind='captions' /></Audio>", Some(config()), None),
|
||||
(r"<Video><Track kind='captions' /></Video>", Some(config()), None),
|
||||
(r"<Video muted></Video>", Some(config()), None),
|
||||
(r"<Video muted={true}></Video>", Some(config()), None),
|
||||
(r"<Audio muted></Audio>", Some(config()), None),
|
||||
(r"<Audio muted={true}></Audio>", Some(config()), None),
|
||||
(r"<Audio><track kind='captions' /></Audio>", None, Some(settings())),
|
||||
(r"<audio><Track kind='captions' /></audio>", None, Some(settings())),
|
||||
(r"<Video><track kind='captions' /></Video>", None, Some(settings())),
|
||||
(r"<video><Track kind='captions' /></video>", None, Some(settings())),
|
||||
(r"<Audio><Track kind='captions' /></Audio>", None, Some(settings())),
|
||||
(r"<Video><Track kind='captions' /></Video>", None, Some(settings())),
|
||||
(r"<Video muted></Video>", None, Some(settings())),
|
||||
(r"<Video muted={true}></Video>", None, Some(settings())),
|
||||
(r"<Audio muted></Audio>", None, Some(settings())),
|
||||
(r"<Audio muted={true}></Audio>", None, Some(settings())),
|
||||
(r"<Box as='audio' muted={true}></Box>", None, Some(settings())),
|
||||
(r"<div />;", None, None, None),
|
||||
(r"<MyDiv />;", None, None, None),
|
||||
(r"<audio><track kind='captions' /></audio>", None, None, None),
|
||||
(r"<audio><track kind='Captions' /></audio>", None, None, None),
|
||||
(r"<audio><track kind='Captions' /><track kind='subtitles' /></audio>", None, None, None),
|
||||
(r"<video><track kind='captions' /></video>", None, None, None),
|
||||
(r"<video><track kind='Captions' /></video>", None, None, None),
|
||||
(r"<video><track kind='Captions' /><track kind='subtitles' /></video>", None, None, None),
|
||||
(r"<audio muted={true}></audio>", None, None, None),
|
||||
(r"<video muted={true}></video>", None, None, None),
|
||||
(r"<video muted></video>", None, None, None),
|
||||
(r"<Audio><track kind='captions' /></Audio>", Some(config()), None, None),
|
||||
(r"<audio><Track kind='captions' /></audio>", Some(config()), None, None),
|
||||
(r"<Video><track kind='captions' /></Video>", Some(config()), None, None),
|
||||
(r"<video><Track kind='captions' /></video>", Some(config()), None, None),
|
||||
(r"<Audio><Track kind='captions' /></Audio>", Some(config()), None, None),
|
||||
(r"<Video><Track kind='captions' /></Video>", Some(config()), None, None),
|
||||
(r"<Video muted></Video>", Some(config()), None, None),
|
||||
(r"<Video muted={true}></Video>", Some(config()), None, None),
|
||||
(r"<Audio muted></Audio>", Some(config()), None, None),
|
||||
(r"<Audio muted={true}></Audio>", Some(config()), None, None),
|
||||
(r"<Audio><track kind='captions' /></Audio>", None, Some(settings()), None),
|
||||
(r"<audio><Track kind='captions' /></audio>", None, Some(settings()), None),
|
||||
(r"<Video><track kind='captions' /></Video>", None, Some(settings()), None),
|
||||
(r"<video><Track kind='captions' /></video>", None, Some(settings()), None),
|
||||
(r"<Audio><Track kind='captions' /></Audio>", None, Some(settings()), None),
|
||||
(r"<Video><Track kind='captions' /></Video>", None, Some(settings()), None),
|
||||
(r"<Video muted></Video>", None, Some(settings()), None),
|
||||
(r"<Video muted={true}></Video>", None, Some(settings()), None),
|
||||
(r"<Audio muted></Audio>", None, Some(settings()), None),
|
||||
(r"<Audio muted={true}></Audio>", None, Some(settings()), None),
|
||||
(r"<Box as='audio' muted={true}></Box>", None, Some(settings()), None),
|
||||
];
|
||||
|
||||
let fail = vec![
|
||||
(r"<audio><track /></audio>", None, None),
|
||||
(r"<audio><track kind='subtitles' /></audio>", None, None),
|
||||
(r"<audio />", None, None),
|
||||
(r"<video><track /></video>", None, None),
|
||||
(r"<video><track kind='subtitles' /></video>", None, None),
|
||||
(r"<Audio muted={false}></Audio>", Some(config()), None),
|
||||
(r"<Video muted={false}></Video>", Some(config()), None),
|
||||
(r"<Audio muted={false}></Audio>", None, Some(settings())),
|
||||
(r"<Video muted={false}></Video>", None, Some(settings())),
|
||||
(r"<video />", None, None),
|
||||
(r"<audio>Foo</audio>", None, None),
|
||||
(r"<video>Foo</video>", None, None),
|
||||
(r"<Audio />", Some(config()), None),
|
||||
(r"<Video />", Some(config()), None),
|
||||
(r"<Audio />", None, Some(settings())),
|
||||
(r"<Video />", None, Some(settings())),
|
||||
(r"<audio><Track /></audio>", Some(config()), None),
|
||||
(r"<video><Track /></video>", Some(config()), None),
|
||||
(r"<Audio><Track kind='subtitles' /></Audio>", Some(config()), None),
|
||||
(r"<Video><Track kind='subtitles' /></Video>", Some(config()), None),
|
||||
(r"<Audio><Track kind='subtitles' /></Audio>", None, Some(settings())),
|
||||
(r"<Video><Track kind='subtitles' /></Video>", None, Some(settings())),
|
||||
(r"<Box as='audio'><Track kind='subtitles' /></Box>", None, Some(settings())),
|
||||
(r"<audio><track /></audio>", None, None, None),
|
||||
(r"<audio><track kind='subtitles' /></audio>", None, None, None),
|
||||
(r"<audio />", None, None, None),
|
||||
(r"<video><track /></video>", None, None, None),
|
||||
(r"<video><track kind='subtitles' /></video>", None, None, None),
|
||||
(r"<Audio muted={false}></Audio>", Some(config()), None, None),
|
||||
(r"<Video muted={false}></Video>", Some(config()), None, None),
|
||||
(r"<Audio muted={false}></Audio>", None, Some(settings()), None),
|
||||
(r"<Video muted={false}></Video>", None, Some(settings()), None),
|
||||
(r"<video />", None, None, None),
|
||||
(r"<audio>Foo</audio>", None, None, None),
|
||||
(r"<video>Foo</video>", None, None, None),
|
||||
(r"<Audio />", Some(config()), None, None),
|
||||
(r"<Video />", Some(config()), None, None),
|
||||
(r"<Audio />", None, Some(settings()), None),
|
||||
(r"<Video />", None, Some(settings()), None),
|
||||
(r"<audio><Track /></audio>", Some(config()), None, None),
|
||||
(r"<video><Track /></video>", Some(config()), None, None),
|
||||
(r"<Audio><Track kind='subtitles' /></Audio>", Some(config()), None, None),
|
||||
(r"<Video><Track kind='subtitles' /></Video>", Some(config()), None, None),
|
||||
(r"<Audio><Track kind='subtitles' /></Audio>", None, Some(settings()), None),
|
||||
(r"<Video><Track kind='subtitles' /></Video>", None, Some(settings()), None),
|
||||
(r"<Box as='audio'><Track kind='subtitles' /></Box>", None, Some(settings()), None),
|
||||
];
|
||||
|
||||
Tester::new_with_settings(MediaHasCaption::NAME, pass, fail).test_and_snapshot();
|
||||
|
|
|
|||
|
|
@ -132,28 +132,28 @@ fn test() {
|
|||
}
|
||||
|
||||
let pass = vec![
|
||||
("<div />;", None, None),
|
||||
("<div autofocus />;", None, None),
|
||||
("<input autofocus='true' />;", None, None),
|
||||
("<Foo bar />", None, None),
|
||||
("<Button />", None, None),
|
||||
("<Foo autoFocus />", Some(config()), None),
|
||||
("<div><div autofocus /></div>", Some(config()), None),
|
||||
("<Button />", None, Some(settings())),
|
||||
("<Button />", Some(config()), Some(settings())),
|
||||
("<div />;", None, None, None),
|
||||
("<div autofocus />;", None, None, None),
|
||||
("<input autofocus='true' />;", None, None, None),
|
||||
("<Foo bar />", None, None, None),
|
||||
("<Button />", None, None, None),
|
||||
("<Foo autoFocus />", Some(config()), None, None),
|
||||
("<div><div autofocus /></div>", Some(config()), None, None),
|
||||
("<Button />", None, Some(settings()), None),
|
||||
("<Button />", Some(config()), Some(settings()), None),
|
||||
];
|
||||
|
||||
let fail = vec![
|
||||
("<div autoFocus />", None, None),
|
||||
("<div autoFocus={true} />", None, None),
|
||||
("<div autoFocus={false} />", None, None),
|
||||
("<div autoFocus={undefined} />", None, None),
|
||||
("<div autoFocus='true' />", None, None),
|
||||
("<div autoFocus='false' />", None, None),
|
||||
("<input autoFocus />", None, None),
|
||||
("<Foo autoFocus />", None, None),
|
||||
("<Button autoFocus />", None, None),
|
||||
("<Button autoFocus />", Some(config()), Some(settings())),
|
||||
("<div autoFocus />", None, None, None),
|
||||
("<div autoFocus={true} />", None, None, None),
|
||||
("<div autoFocus={false} />", None, None, None),
|
||||
("<div autoFocus={undefined} />", None, None, None),
|
||||
("<div autoFocus='true' />", None, None, None),
|
||||
("<div autoFocus='false' />", None, None, None),
|
||||
("<input autoFocus />", None, None, None),
|
||||
("<Foo autoFocus />", None, None, None),
|
||||
("<Button autoFocus />", None, None, None),
|
||||
("<Button autoFocus />", Some(config()), Some(settings()), None),
|
||||
];
|
||||
|
||||
Tester::new_with_settings(NoAutofocus::NAME, pass, fail).test_and_snapshot();
|
||||
|
|
|
|||
|
|
@ -88,22 +88,22 @@ fn test() {
|
|||
}
|
||||
|
||||
let pass = vec![
|
||||
(r"<div />", None, None),
|
||||
(r"<Marquee />", None, None),
|
||||
(r"<div marquee />", None, None),
|
||||
(r"<Blink />", None, None),
|
||||
(r"<div blink />", None, None),
|
||||
(r"<div />", None, None, None),
|
||||
(r"<Marquee />", None, None, None),
|
||||
(r"<div marquee />", None, None, None),
|
||||
(r"<Blink />", None, None, None),
|
||||
(r"<div blink />", None, None, None),
|
||||
];
|
||||
|
||||
let fail = vec![
|
||||
(r"<marquee />", None, None),
|
||||
(r"<marquee {...props} />", None, None),
|
||||
(r"<marquee lang={undefined} />", None, None),
|
||||
(r"<blink />", None, None),
|
||||
(r"<blink {...props} />", None, None),
|
||||
(r"<blink foo={undefined} />", None, None),
|
||||
(r"<Blink />", Some(config()), Some(settings())),
|
||||
(r"<Marquee />", Some(config()), Some(settings())),
|
||||
(r"<marquee />", None, None, None),
|
||||
(r"<marquee {...props} />", None, None, None),
|
||||
(r"<marquee lang={undefined} />", None, None, None),
|
||||
(r"<blink />", None, None, None),
|
||||
(r"<blink {...props} />", None, None, None),
|
||||
(r"<blink foo={undefined} />", None, None, None),
|
||||
(r"<Blink />", Some(config()), Some(settings()), None),
|
||||
(r"<Marquee />", Some(config()), Some(settings()), None),
|
||||
];
|
||||
|
||||
Tester::new_with_settings(NoDistractingElements::NAME, pass, fail).test_and_snapshot();
|
||||
|
|
|
|||
|
|
@ -120,3 +120,24 @@ impl Rule for FilenameCase {
|
|||
ctx.diagnostic(FilenameCaseDiagnostic(Span::default(), case_name));
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test() {
|
||||
use crate::tester::Tester;
|
||||
use std::path::PathBuf;
|
||||
|
||||
let pass = vec![
|
||||
// should pass - camel_case, pascal_case both allowed
|
||||
("", None, None, Some(PathBuf::from("foo/bar/baz/Que.tsx"))),
|
||||
// should pass - camel_case, pascal_case both allowed
|
||||
("", None, None, Some(PathBuf::from("foo/bar/baz/QueAbc.tsx"))),
|
||||
];
|
||||
let fail = vec![
|
||||
// should pass - by default kebab_case is not allowed
|
||||
("import foo from 'bar'", None, None, Some(PathBuf::from("foo/bar/baz/aaa-bbb.tsx"))),
|
||||
// should pass - by default snake_case is not allowed
|
||||
("baz;", None, None, Some(PathBuf::from("foo/bar/baz/foo_bar.tsx"))),
|
||||
];
|
||||
|
||||
Tester::new_with_settings(FilenameCase::NAME, pass, fail).test_and_snapshot();
|
||||
}
|
||||
|
|
|
|||
17
crates/oxc_linter/src/snapshots/filename_case.snap
Normal file
17
crates/oxc_linter/src/snapshots/filename_case.snap
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
---
|
||||
source: crates/oxc_linter/src/tester.rs
|
||||
expression: filename_case
|
||||
---
|
||||
⚠ eslint-plugin-unicorn(filename-case): Filename should not be in kebab case
|
||||
╭─[filename_case.tsx:1:1]
|
||||
1 │ import foo from 'bar'
|
||||
· ▲
|
||||
╰────
|
||||
|
||||
⚠ eslint-plugin-unicorn(filename-case): Filename should not be in snake case
|
||||
╭─[filename_case.tsx:1:1]
|
||||
1 │ baz;
|
||||
· ▲
|
||||
╰────
|
||||
|
||||
|
||||
|
|
@ -20,11 +20,13 @@ enum TestResult {
|
|||
Fixed(String),
|
||||
}
|
||||
|
||||
type TestCase = (String, Option<Value>, Option<Value>, Option<PathBuf>);
|
||||
|
||||
pub struct Tester {
|
||||
rule_name: &'static str,
|
||||
rule_path: PathBuf,
|
||||
expect_pass: Vec<(String, Option<Value>, Option<Value>)>,
|
||||
expect_fail: Vec<(String, Option<Value>, Option<Value>)>,
|
||||
expect_pass: Vec<TestCase>,
|
||||
expect_fail: Vec<TestCase>,
|
||||
expect_fix: Vec<(String, String, Option<Value>)>,
|
||||
snapshot: String,
|
||||
current_working_directory: Box<Path>,
|
||||
|
|
@ -41,25 +43,26 @@ impl Tester {
|
|||
expect_fail: Vec<(S, Option<Value>)>,
|
||||
) -> Self {
|
||||
let expect_pass =
|
||||
expect_pass.into_iter().map(|(s, r)| (s.into(), r, None)).collect::<Vec<_>>();
|
||||
expect_pass.into_iter().map(|(s, r)| (s.into(), r, None, None)).collect::<Vec<_>>();
|
||||
let expect_fail =
|
||||
expect_fail.into_iter().map(|(s, r)| (s.into(), r, None)).collect::<Vec<_>>();
|
||||
expect_fail.into_iter().map(|(s, r)| (s.into(), r, None, None)).collect::<Vec<_>>();
|
||||
Self::new_with_settings(rule_name, expect_pass, expect_fail)
|
||||
}
|
||||
|
||||
#[allow(clippy::type_complexity)]
|
||||
pub fn new_with_settings<S: Into<String>>(
|
||||
rule_name: &'static str,
|
||||
expect_pass: Vec<(S, Option<Value>, Option<Value>)>,
|
||||
expect_fail: Vec<(S, Option<Value>, Option<Value>)>,
|
||||
expect_pass: Vec<(S, Option<Value>, Option<Value>, Option<PathBuf>)>,
|
||||
expect_fail: Vec<(S, Option<Value>, Option<Value>, Option<PathBuf>)>,
|
||||
) -> Self {
|
||||
let rule_path = PathBuf::from(rule_name.replace('-', "_")).with_extension("tsx");
|
||||
let expect_pass = expect_pass
|
||||
.into_iter()
|
||||
.map(|(s, r, settings)| (s.into(), r, settings))
|
||||
.map(|(s, r, settings, p)| (s.into(), r, settings, p))
|
||||
.collect::<Vec<_>>();
|
||||
let expect_fail = expect_fail
|
||||
.into_iter()
|
||||
.map(|(s, r, settings)| (s.into(), r, settings))
|
||||
.map(|(s, r, settings, p)| (s.into(), r, settings, p))
|
||||
.collect::<Vec<_>>();
|
||||
let current_working_directory =
|
||||
env::current_dir().unwrap().join("fixtures/import").into_boxed_path();
|
||||
|
|
@ -84,9 +87,9 @@ impl Tester {
|
|||
expect_fail: Vec<S>,
|
||||
) -> Self {
|
||||
let expect_pass =
|
||||
expect_pass.into_iter().map(|s| (s.into(), None, None)).collect::<Vec<_>>();
|
||||
expect_pass.into_iter().map(|s| (s.into(), None, None, None)).collect::<Vec<_>>();
|
||||
let expect_fail =
|
||||
expect_fail.into_iter().map(|s| (s.into(), None, None)).collect::<Vec<_>>();
|
||||
expect_fail.into_iter().map(|s| (s.into(), None, None, None)).collect::<Vec<_>>();
|
||||
Self::new_with_settings(rule_name, expect_pass, expect_fail)
|
||||
}
|
||||
|
||||
|
|
@ -96,9 +99,9 @@ impl Tester {
|
|||
expect_fail: Vec<S>,
|
||||
) -> Self {
|
||||
self.expect_pass =
|
||||
expect_pass.into_iter().map(|s| (s.into(), None, None)).collect::<Vec<_>>();
|
||||
expect_pass.into_iter().map(|s| (s.into(), None, None, None)).collect::<Vec<_>>();
|
||||
self.expect_fail =
|
||||
expect_fail.into_iter().map(|s| (s.into(), None, None)).collect::<Vec<_>>();
|
||||
expect_fail.into_iter().map(|s| (s.into(), None, None, None)).collect::<Vec<_>>();
|
||||
self
|
||||
}
|
||||
|
||||
|
|
@ -153,16 +156,16 @@ impl Tester {
|
|||
}
|
||||
|
||||
fn test_pass(&mut self) {
|
||||
for (test, config, settings) in self.expect_pass.clone() {
|
||||
let result = self.run(&test, config, false, &settings);
|
||||
for (test, config, settings, path) in self.expect_pass.clone() {
|
||||
let result = self.run(&test, config, false, &settings, &path);
|
||||
let passed = result == TestResult::Passed;
|
||||
assert!(passed, "expect test to pass: {test} {}", self.snapshot);
|
||||
}
|
||||
}
|
||||
|
||||
fn test_fail(&mut self) {
|
||||
for (test, config, settings) in self.expect_fail.clone() {
|
||||
let result = self.run(&test, config, false, &settings);
|
||||
for (test, config, settings, path) in self.expect_fail.clone() {
|
||||
let result = self.run(&test, config, false, &settings, &path);
|
||||
let failed = result == TestResult::Failed;
|
||||
assert!(failed, "expect test to fail: {test}");
|
||||
}
|
||||
|
|
@ -170,7 +173,7 @@ impl Tester {
|
|||
|
||||
fn test_fix(&mut self) {
|
||||
for (test, expected, config) in self.expect_fix.clone() {
|
||||
let result = self.run(&test, config, true, &None);
|
||||
let result = self.run(&test, config, true, &None, &None);
|
||||
if let TestResult::Fixed(fixed_str) = result {
|
||||
assert_eq!(expected, fixed_str);
|
||||
} else {
|
||||
|
|
@ -185,6 +188,7 @@ impl Tester {
|
|||
config: Option<Value>,
|
||||
is_fix: bool,
|
||||
settings: &Option<Value>,
|
||||
path: &Option<PathBuf>,
|
||||
) -> TestResult {
|
||||
let allocator = Allocator::default();
|
||||
let rule = self.find_rule().read_json(config);
|
||||
|
|
@ -201,10 +205,14 @@ impl Tester {
|
|||
.with_rules(vec![rule])
|
||||
.with_settings(lint_settings);
|
||||
let path_to_lint = if self.import_plugin {
|
||||
assert!(path.is_none(), "import plugin does not support path");
|
||||
self.current_working_directory.join(&self.rule_path)
|
||||
} else if let Some(path) = path {
|
||||
self.current_working_directory.join(path)
|
||||
} else {
|
||||
self.rule_path.clone()
|
||||
};
|
||||
|
||||
let lint_service = LintService::from_linter(
|
||||
self.current_working_directory.clone(),
|
||||
&[path_to_lint.into_boxed_path()],
|
||||
|
|
@ -229,6 +237,7 @@ impl Tester {
|
|||
&self.rule_path
|
||||
}
|
||||
.to_string_lossy();
|
||||
|
||||
let handler = GraphicalReportHandler::new_themed(GraphicalTheme::unicode_nocolor());
|
||||
for diagnostic in result {
|
||||
let diagnostic = diagnostic.error.with_source_code(source_text.to_string());
|
||||
|
|
|
|||
Loading…
Reference in a new issue