Skip to content

Commit

Permalink
test duplicate rule merging after bundling
Browse files Browse the repository at this point in the history
  • Loading branch information
evanw committed Nov 21, 2022
1 parent a73c4e9 commit 6664172
Show file tree
Hide file tree
Showing 3 changed files with 181 additions and 29 deletions.
46 changes: 46 additions & 0 deletions internal/bundler/bundler_css_test.go
Expand Up @@ -745,3 +745,49 @@ func TestMetafileCSSBundleTwoToOne(t *testing.T) {
},
})
}

func TestDeduplicateRules(t *testing.T) {
// These are done as bundler tests instead of parser tests because rule
// deduplication now happens during linking (so that it has effects across files)
css_suite.expectBundled(t, bundled{
files: map[string]string{
"/yes0.css": "a { color: red; color: green; color: red }",
"/yes1.css": "a { color: red } a { color: green } a { color: red }",
"/yes2.css": "@media screen { a { color: red } } @media screen { a { color: red } }",

"/no0.css": "@media screen { a { color: red } } @media screen { & a { color: red } }",
"/no1.css": "@media screen { a { color: red } } @media screen { a[x] { color: red } }",
"/no2.css": "@media screen { a { color: red } } @media screen { a.x { color: red } }",
"/no3.css": "@media screen { a { color: red } } @media screen { a#x { color: red } }",
"/no4.css": "@media screen { a { color: red } } @media screen { a:x { color: red } }",
"/no5.css": "@media screen { a:x { color: red } } @media screen { a:x(y) { color: red } }",
"/no6.css": "@media screen { a b { color: red } } @media screen { a + b { color: red } }",

"/across-files.css": "@import 'across-files-0.css'; @import 'across-files-1.css'; @import 'across-files-2.css';",
"/across-files-0.css": "a { color: red; color: red }",
"/across-files-1.css": "a { color: green }",
"/across-files-2.css": "a { color: red }",
},
entryPaths: []string{
"/yes0.css",
"/yes1.css",
"/yes2.css",

"/no0.css",
"/no1.css",
"/no2.css",
"/no3.css",
"/no4.css",
"/no5.css",
"/no6.css",

"/across-files.css",
},
options: config.Options{
Mode: config.ModeBundle,
AbsOutputDir: "/out",
MinifySyntax: true,
},
expectedScanLog: "no0.css: WARNING: CSS nesting syntax cannot be used outside of a style rule\n",
})
}
135 changes: 135 additions & 0 deletions internal/bundler/snapshots/snapshots_css.txt
Expand Up @@ -196,6 +196,141 @@ a {
background: url(data:image/png;base64,iVBORw0KGgo=);
}

================================================================================
TestDeduplicateRules
---------- /out/yes0.css ----------
/* yes0.css */
a {
color: green;
color: red;
}

---------- /out/yes1.css ----------
/* yes1.css */
a {
color: green;
}
a {
color: red;
}

---------- /out/yes2.css ----------
/* yes2.css */
@media screen {
a {
color: red;
}
}

---------- /out/no0.css ----------
/* no0.css */
@media screen {
a {
color: red;
}
}
@media screen {
& a {
color: red;
}
}

---------- /out/no1.css ----------
/* no1.css */
@media screen {
a {
color: red;
}
}
@media screen {
a[x] {
color: red;
}
}

---------- /out/no2.css ----------
/* no2.css */
@media screen {
a {
color: red;
}
}
@media screen {
a.x {
color: red;
}
}

---------- /out/no3.css ----------
/* no3.css */
@media screen {
a {
color: red;
}
}
@media screen {
a#x {
color: red;
}
}

---------- /out/no4.css ----------
/* no4.css */
@media screen {
a {
color: red;
}
}
@media screen {
a:x {
color: red;
}
}

---------- /out/no5.css ----------
/* no5.css */
@media screen {
a:x {
color: red;
}
}
@media screen {
a:x(y) {
color: red;
}
}

---------- /out/no6.css ----------
/* no6.css */
@media screen {
a b {
color: red;
}
}
@media screen {
a + b {
color: red;
}
}

---------- /out/across-files.css ----------
/* across-files-0.css */
a {
color: red;
}

/* across-files-1.css */
a {
color: green;
}

/* across-files-2.css */
a {
color: red;
}

/* across-files.css */

================================================================================
TestExternalImportURLInCSS
---------- /out/entry.css ----------
Expand Down
29 changes: 0 additions & 29 deletions internal/css_parser/css_parser_test.go
Expand Up @@ -1391,35 +1391,6 @@ func TestBoxShadow(t *testing.T) {
expectPrintedMangleMinify(t, "a { box-shadow: rgb(255, 0, 17) 0 0 1 inset }", "a{box-shadow:#f01 0 0 1 inset}")
}

func TestDeduplicateRules(t *testing.T) {
expectPrinted(t, "a { color: red; color: green; color: red }",
"a {\n color: red;\n color: green;\n color: red;\n}\n")
expectPrintedMangle(t, "a { color: red; color: green; color: red }",
"a {\n color: green;\n color: red;\n}\n")

expectPrinted(t, "a { color: red } a { color: green } a { color: red }",
"a {\n color: red;\n}\na {\n color: green;\n}\na {\n color: red;\n}\n")
expectPrintedMangle(t, "a { color: red } a { color: green } a { color: red }",
"a {\n color: green;\n}\na {\n color: red;\n}\n")

expectPrintedMangle(t, "@media screen { a { color: red } } @media screen { a { color: red } }",
"@media screen {\n a {\n color: red;\n }\n}\n")
expectPrintedMangle(t, "@media screen { a { color: red } } @media screen { & a { color: red } }",
"@media screen {\n a {\n color: red;\n }\n}\n@media screen {\n & a {\n color: red;\n }\n}\n")
expectPrintedMangle(t, "@media screen { a { color: red } } @media screen { a[x] { color: red } }",
"@media screen {\n a {\n color: red;\n }\n}\n@media screen {\n a[x] {\n color: red;\n }\n}\n")
expectPrintedMangle(t, "@media screen { a { color: red } } @media screen { a.x { color: red } }",
"@media screen {\n a {\n color: red;\n }\n}\n@media screen {\n a.x {\n color: red;\n }\n}\n")
expectPrintedMangle(t, "@media screen { a { color: red } } @media screen { a#x { color: red } }",
"@media screen {\n a {\n color: red;\n }\n}\n@media screen {\n a#x {\n color: red;\n }\n}\n")
expectPrintedMangle(t, "@media screen { a { color: red } } @media screen { a:x { color: red } }",
"@media screen {\n a {\n color: red;\n }\n}\n@media screen {\n a:x {\n color: red;\n }\n}\n")
expectPrintedMangle(t, "@media screen { a:x { color: red } } @media screen { a:x(y) { color: red } }",
"@media screen {\n a:x {\n color: red;\n }\n}\n@media screen {\n a:x(y) {\n color: red;\n }\n}\n")
expectPrintedMangle(t, "@media screen { a b { color: red } } @media screen { a + b { color: red } }",
"@media screen {\n a b {\n color: red;\n }\n}\n@media screen {\n a + b {\n color: red;\n }\n}\n")
}

func TestMangleTime(t *testing.T) {
expectPrintedMangle(t, "a { animation: b 1s }", "a {\n animation: b 1s;\n}\n")
expectPrintedMangle(t, "a { animation: b 1.s }", "a {\n animation: b 1s;\n}\n")
Expand Down

0 comments on commit 6664172

Please sign in to comment.