| package parsers |
| |
| import ( |
| "testing" |
| |
| "github.com/stretchr/testify/require" |
| "go.skia.org/infra/go/testutils/unittest" |
| ) |
| |
| func TestParseTSImports_Success(t *testing.T) { |
| unittest.SmallTest(t) |
| |
| const source = `/* Sample TypeScript file with imports. */ |
| import 'path/to/a'; // This comment should be ignored. |
| import "path/to/b"; // This comment should be ignored. |
| import * from 'path/to/c'; // This comment should be ignored. |
| import * from "path/to/d"; // This comment should be ignored. |
| export * from 'path/to/e'; // This comment should be ignored. |
| export * from "path/to/f"; // This comment should be ignored. |
| import * as foo from 'path/to/g'; // This comment should be ignored. |
| import * as foo from "path/to/h"; // This comment should be ignored. |
| import { foo_bar, $ } from 'path/to/i'; // This comment should be ignored. |
| import { foo_bar, $ } from "path/to/j"; // This comment should be ignored. |
| import { foo as bar } from 'path/to/k'; // This comment should be ignored. |
| import { foo as bar } from "path/to/l"; // This comment should be ignored. |
| import foo, { bar, baz as qux } from 'path/to/m'; // This comment should be ignored. |
| import foo, { bar, baz as qux } from "path/to/n"; // This comment should be ignored. |
| import { // This comment should be ignored. |
| foo, // This comment should be ignored. |
| bar, // This comment should be ignored. |
| } from 'path/to/o'; // This comment should be ignored. |
| import { // This comment should be ignored. |
| foo, // This comment should be ignored. |
| bar, // This comment should be ignored. |
| } from "path/to/p"; // This comment should be ignored. |
| |
| // CSS and Sass imports should be ignored. |
| import 'styles/a.css'; |
| import 'styles/b.scss'; |
| |
| // Duplicate imports should be ignored. |
| import 'path/to/a'; |
| |
| // Line comments should be ignored. |
| // |
| // import 'line-comment/a'; |
| // import { |
| // foo, |
| // bar, |
| // } from 'line-comment/b'; |
| |
| // Block comments should be ignored. |
| /* |
| import 'block-comment/a'; |
| import * from 'block-comment/b'; |
| */ |
| |
| // A more complex block comment. |
| thisWillBeIgnored(); /* |
| import 'block-comment/c'; |
| import * from 'block-comment/d'; */ import 'path/to/q'; // This import should NOT be ignored. |
| |
| // A block comment that starts and ends on the same line. |
| import /* 'block-comment/e' */ 'path/to/r': |
| |
| // Tests for various edge cases. Some of these are invalid TS because import is a reserved keyword. |
| importfrom('ignored/a'); |
| import = 'from "ignored/b"'; |
| import['from "ignored/c"'](); |
| import.from = 'ignored/d'; |
| import.from('ignored/e'); |
| from('ignored/f'); |
| from = 'ignored/g'; |
| "import 'ignored/h'"; |
| ` |
| |
| expected := []string{ |
| "path/to/a", |
| "path/to/b", |
| "path/to/c", |
| "path/to/d", |
| "path/to/e", |
| "path/to/f", |
| "path/to/g", |
| "path/to/h", |
| "path/to/i", |
| "path/to/j", |
| "path/to/k", |
| "path/to/l", |
| "path/to/m", |
| "path/to/n", |
| "path/to/o", |
| "path/to/p", |
| "path/to/q", |
| "path/to/r", |
| } |
| |
| require.Equal(t, expected, ParseTSImports(source)) |
| } |
| |
| func TestParseSassImports_Success(t *testing.T) { |
| unittest.SmallTest(t) |
| |
| const source = `/* Sample Sass file with @import, @use and @forward statements. */ |
| @import 'path/to/a'; // This comment should be ignored. |
| @import "path/to/b"; // This comment should be ignored. |
| |
| @use 'path/to/c'; // This comment should be ignored. |
| @use "path/to/d"; // This comment should be ignored. |
| @use 'path/to/e' as foo; // This comment should be ignored. |
| @use "path/to/f" as foo; // This comment should be ignored. |
| @use 'path/to/g' with ( // This comment should be ignored. |
| $foo: 1px, // This comment should be ignored. |
| $bar: #222 // This comment should be ignored. |
| ); // This comment should be ignored. |
| @use "path/to/h" with ( // This comment should be ignored. |
| $foo: 1px, // This comment should be ignored. |
| $bar: #222 // This comment should be ignored. |
| ); // This comment should be ignored. |
| |
| @forward 'path/to/i'; // This comment should be ignored. |
| @forward "path/to/j"; // This comment should be ignored. |
| @forward 'path/to/k' as foo-*; // This comment should be ignored. |
| @forward "path/to/l" as foo-*; // This comment should be ignored. |
| @forward 'path/to/m' hide $foo, $bar; // This comment should be ignored. |
| @forward "path/to/n" hide $foo, $bar; // This comment should be ignored. |
| @forward 'path/to/o' with ( // This comment should be ignored. |
| $foo: 1px, // This comment should be ignored. |
| $bar: #222 // This comment should be ignored. |
| ) // This comment should be ignored. |
| @forward "path/to/p" with ( // This comment should be ignored. |
| $foo: 1px, // This comment should be ignored. |
| $bar: #222 // This comment should be ignored. |
| ) // This comment should be ignored. |
| |
| // Plain CSS imports should be ignored. |
| @import "theme.css"; |
| @import "http://fonts.googleapis.com/css?family=Droid+Sans"; |
| @import url(theme); |
| @import "landscape.css" screen and (orientation: landscape); |
| |
| // Duplicate imports should be ignored. |
| @import 'path/to/a'; |
| |
| // Line comments should be ignored. |
| // |
| // @import 'line-comment/a'; |
| // @use 'line-comment/b' with ( |
| // $foo: 1px, |
| // $bar: #222 |
| // ); |
| |
| // Block comments should be ignored. |
| /* |
| @import 'block-comment/a'; |
| @use 'block-comment/b'; |
| @forward 'block-comment/c'; |
| */ |
| |
| // A more complex block comment. |
| .this-will-be-ignored {} /* |
| @import 'block-comment/d'; |
| @use 'block-comment/e'; |
| @forward 'block-comment/f'; */ @import 'path/to/q'; // This import should NOT be ignored. |
| |
| // A block comment that starts and ends on the same line. |
| @import /* 'block-comment/g' */ 'path/to/r': |
| ` |
| |
| expected := []string{ |
| "path/to/a", |
| "path/to/b", |
| "path/to/c", |
| "path/to/d", |
| "path/to/e", |
| "path/to/f", |
| "path/to/g", |
| "path/to/h", |
| "path/to/i", |
| "path/to/j", |
| "path/to/k", |
| "path/to/l", |
| "path/to/m", |
| "path/to/n", |
| "path/to/o", |
| "path/to/p", |
| "path/to/q", |
| "path/to/r", |
| } |
| |
| require.Equal(t, expected, ParseSassImports(source)) |
| } |