From 66641726009aa52b357be3d811b958b39057d247 Mon Sep 17 00:00:00 2001 From: Evan Wallace Date: Sun, 20 Nov 2022 23:24:45 -0500 Subject: [PATCH] test duplicate rule merging after bundling --- internal/bundler/bundler_css_test.go | 46 +++++++ internal/bundler/snapshots/snapshots_css.txt | 135 +++++++++++++++++++ internal/css_parser/css_parser_test.go | 29 ---- 3 files changed, 181 insertions(+), 29 deletions(-) diff --git a/internal/bundler/bundler_css_test.go b/internal/bundler/bundler_css_test.go index 5bb668ce4d0..f79bfeb8541 100644 --- a/internal/bundler/bundler_css_test.go +++ b/internal/bundler/bundler_css_test.go @@ -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", + }) +} diff --git a/internal/bundler/snapshots/snapshots_css.txt b/internal/bundler/snapshots/snapshots_css.txt index c253d86f751..8ba4e73d67f 100644 --- a/internal/bundler/snapshots/snapshots_css.txt +++ b/internal/bundler/snapshots/snapshots_css.txt @@ -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 ---------- diff --git a/internal/css_parser/css_parser_test.go b/internal/css_parser/css_parser_test.go index 9512bc68ba6..61ff272deb4 100644 --- a/internal/css_parser/css_parser_test.go +++ b/internal/css_parser/css_parser_test.go @@ -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")