From 48308dfd427e9b489124604a9304864416bfebd6 Mon Sep 17 00:00:00 2001 From: Natalie Weizenbaum Date: Tue, 3 Mar 2020 20:47:22 -0800 Subject: [PATCH] Add specs for selector-unify() See #1001 --- spec/core_functions/selector/unify/README.md | 4 + .../selector/unify/chooses_superselector.hrx | 43 ++ .../selector/unify/complex/combinators.hrx | 451 ++++++++++++++++++ .../selector/unify/complex/distinct.hrx | 17 + .../selector/unify/complex/identical.hrx | 27 ++ .../selector/unify/complex/lcs.hrx | 48 ++ .../selector/unify/complex/overlap.hrx | 62 +++ .../selector/unify/complex/root.hrx | 84 ++++ .../selector/unify/complex/superselector.hrx | 27 ++ .../selector/unify/compound.hrx | 87 ++++ spec/core_functions/selector/unify/error.hrx | 139 ++++++ spec/core_functions/selector/unify/format.hrx | 50 ++ .../selector/unify/simple/attribute.hrx | 17 + .../selector/unify/simple/class.hrx | 17 + .../selector/unify/simple/different_types.hrx | 7 + .../selector/unify/simple/id.hrx | 17 + .../selector/unify/simple/placeholder.hrx | 17 + .../selector/unify/simple/pseudo.hrx | 144 ++++++ .../selector/unify/simple/type.hrx | 437 +++++++++++++++++ .../selector/unify/simple/universal.hrx | 327 +++++++++++++ 20 files changed, 2022 insertions(+) create mode 100644 spec/core_functions/selector/unify/README.md create mode 100644 spec/core_functions/selector/unify/chooses_superselector.hrx create mode 100644 spec/core_functions/selector/unify/complex/combinators.hrx create mode 100644 spec/core_functions/selector/unify/complex/distinct.hrx create mode 100644 spec/core_functions/selector/unify/complex/identical.hrx create mode 100644 spec/core_functions/selector/unify/complex/lcs.hrx create mode 100644 spec/core_functions/selector/unify/complex/overlap.hrx create mode 100644 spec/core_functions/selector/unify/complex/root.hrx create mode 100644 spec/core_functions/selector/unify/complex/superselector.hrx create mode 100644 spec/core_functions/selector/unify/compound.hrx create mode 100644 spec/core_functions/selector/unify/error.hrx create mode 100644 spec/core_functions/selector/unify/format.hrx create mode 100644 spec/core_functions/selector/unify/simple/attribute.hrx create mode 100644 spec/core_functions/selector/unify/simple/class.hrx create mode 100644 spec/core_functions/selector/unify/simple/different_types.hrx create mode 100644 spec/core_functions/selector/unify/simple/id.hrx create mode 100644 spec/core_functions/selector/unify/simple/placeholder.hrx create mode 100644 spec/core_functions/selector/unify/simple/pseudo.hrx create mode 100644 spec/core_functions/selector/unify/simple/type.hrx create mode 100644 spec/core_functions/selector/unify/simple/universal.hrx diff --git a/spec/core_functions/selector/unify/README.md b/spec/core_functions/selector/unify/README.md new file mode 100644 index 0000000000..18e4aa9b53 --- /dev/null +++ b/spec/core_functions/selector/unify/README.md @@ -0,0 +1,4 @@ +Simple selector unification generally relies heavily on superselector logic for +determining when one selector can be omitted. Since this logic is already +thoroughly tested in `is-superselector()`, it's not duplicated here, other than +a few test cases to ensure that superselector logic is working at all. diff --git a/spec/core_functions/selector/unify/chooses_superselector.hrx b/spec/core_functions/selector/unify/chooses_superselector.hrx new file mode 100644 index 0000000000..ad1550d5e7 --- /dev/null +++ b/spec/core_functions/selector/unify/chooses_superselector.hrx @@ -0,0 +1,43 @@ +<===> README.md +These tests verify that, if one selector is a superselector of the other, the +subselector is returned (since it's more specific). + +<===> +================================================================================ +<===> whole_selector/selector1/input.scss +a {b: selector-unify("c", "d c.e")} + +<===> whole_selector/selector1/output.css +a { + b: d c.e; +} + +<===> +================================================================================ +<===> whole_selector/selector2/input.scss +a {b: selector-unify("d c.e", "c")} + +<===> whole_selector/selector2/output.css +a { + b: d c.e; +} + +<===> +================================================================================ +<===> parent/selector1/input.scss +a {b: selector-unify("c d", "c.e .f")} + +<===> parent/selector1/output.css +a { + b: c.e d.f; +} + +<===> +================================================================================ +<===> parent/selector2/input.scss +a {b: selector-unify("c.e .f", "c d")} + +<===> parent/selector2/output.css +a { + b: c.e d.f; +} diff --git a/spec/core_functions/selector/unify/complex/combinators.hrx b/spec/core_functions/selector/unify/complex/combinators.hrx new file mode 100644 index 0000000000..8fb7430c9f --- /dev/null +++ b/spec/core_functions/selector/unify/complex/combinators.hrx @@ -0,0 +1,451 @@ +<===> child/and_descendant/distinct/input.scss +a {b: selector-unify(".c > .d", ".e .f")} + +<===> child/and_descendant/distinct/output.css +a { + b: .e .c > .d.f; +} + +<===> +================================================================================ +<===> child/and_descendant/identical/input.scss +a {b: selector-unify(".c > .s1", ".c .s2")} + +<===> child/and_descendant/identical/output.css +a { + b: .c > .s1.s2; +} + +<===> +================================================================================ +<===> child/and_descendant/superselector/input.scss +a {b: selector-unify(".c.s1-1 > .s1-2", ".c .s2")} + +<===> child/and_descendant/superselector/output.css +a { + b: .c.s1-1 > .s1-2.s2; +} + +<===> +================================================================================ +<===> child/and_descendant/overlap/input.scss +a {b: selector-unify(".c.s1-1 > .s1-2", ".c.s2-1 .s2-2")} + +<===> child/and_descendant/overlap/output.css +a { + b: .c.s2-1 .c.s1-1 > .s1-2.s2-2; +} + +<===> +================================================================================ +<===> child/and_child/distinct/input.scss +a {b: selector-unify(".c > .d", ".e > .f")} + +<===> child/and_child/distinct/output.css +a { + b: .e.c > .d.f; +} + +<===> +================================================================================ +<===> child/and_child/superselector/input.scss +a {b: selector-unify(".c.s1-1 > .s1-2", ".c > .s2")} + +<===> child/and_child/superselector/output.css +a { + b: .c.s1-1 > .s1-2.s2; +} + +<===> +================================================================================ +<===> child/and_child/overlap/input.scss +a {b: selector-unify(".c.s1-1 > .s1-2", ".c.s2-1 > .s2-2")} + +<===> child/and_child/overlap/output.css +a { + b: .c.s2-1.s1-1 > .s1-2.s2-2; +} + +<===> +================================================================================ +<===> child/and_child/conflict/input.scss +a {b: inspect(selector-unify("#s1-1 > .s1-2", "#s2-1 > .s2-2"))} + +<===> child/and_child/conflict/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> child/and_sibling/input.scss +a {b: selector-unify(".c > .s1", ".c ~ .s2")} + +<===> child/and_sibling/output.css +a { + b: .c > .c ~ .s1.s2; +} + +<===> +================================================================================ +<===> child/and_next_sibling/input.scss +a {b: selector-unify(".c > .s1", ".c + .s2")} + +<===> child/and_next_sibling/output.css +a { + b: .c > .c + .s1.s2; +} + +<===> +================================================================================ +<===> sibling/and_descendant/input.scss +a {b: selector-unify(".c ~ .s1", ".c .s2")} + +<===> sibling/and_descendant/output.css +a { + b: .c .c ~ .s1.s2; +} + +<===> +================================================================================ +<===> sibling/and_child/input.scss +a {b: selector-unify(".c ~ .s1", ".c > .s2")} + +<===> sibling/and_child/output.css +a { + b: .c > .c ~ .s1.s2; +} + +<===> +================================================================================ +<===> sibling/and_sibling/distinct/input.scss +a {b: selector-unify(".c ~ .d", ".e ~ .f")} + +<===> sibling/and_sibling/distinct/output.css +a { + b: .c ~ .e ~ .d.f, .e ~ .c ~ .d.f, .e.c ~ .d.f; +} + +<===> +================================================================================ +<===> sibling/and_sibling/identical/input.scss +a {b: selector-unify(".c ~ .s1", ".c ~ .s2")} + +<===> sibling/and_sibling/identical/output.css +a { + b: .c ~ .s1.s2; +} + +<===> +================================================================================ +<===> sibling/and_sibling/superselector/input.scss +a {b: selector-unify(".c.s1-1 ~ .s1-2", ".c ~ .s2")} + +<===> sibling/and_sibling/superselector/output.css +a { + b: .c.s1-1 ~ .s1-2.s2; +} + +<===> +================================================================================ +<===> sibling/and_sibling/overlap/input.scss +a {b: selector-unify(".c.s1-1 ~ .s1-2", ".c.s2-1 ~ .s2-2")} + +<===> sibling/and_sibling/overlap/output.css +a { + b: .c.s1-1 ~ .c.s2-1 ~ .s1-2.s2-2, .c.s2-1 ~ .c.s1-1 ~ .s1-2.s2-2, .c.s2-1.s1-1 ~ .s1-2.s2-2; +} + +<===> +================================================================================ +<===> sibling/and_sibling/conflict/input.scss +a {b: selector-unify("#s1-1 ~ .s1-2", "#s2-1 ~ .s2-2")} + +<===> sibling/and_sibling/conflict/output.css +a { + b: #s1-1 ~ #s2-1 ~ .s1-2.s2-2, #s2-1 ~ #s1-1 ~ .s1-2.s2-2; +} + +<===> +================================================================================ +<===> sibling/and_next_sibling/distinct/input.scss +a {b: selector-unify(".c ~ .d", ".e + .f")} + +<===> sibling/and_next_sibling/distinct/output.css +a { + b: .c ~ .e + .d.f, .e.c + .d.f; +} + +<===> +================================================================================ +<===> sibling/and_next_sibling/identical/input.scss +a {b: selector-unify(".c ~ .s1", ".c + .s2")} + +<===> sibling/and_next_sibling/identical/output.css +a { + b: .c + .s1.s2; +} + +<===> +================================================================================ +<===> sibling/and_next_sibling/superselector/input.scss +a {b: selector-unify(".c.s1-1 ~ .s1-2", ".c + .s2")} + +<===> sibling/and_next_sibling/superselector/output.css +a { + b: .c.s1-1 ~ .c + .s1-2.s2, .c.s1-1 + .s1-2.s2; +} + +<===> +================================================================================ +<===> sibling/and_next_sibling/overlap/input.scss +a {b: selector-unify(".c.s1-1 ~ .s1-2", ".c.s2-1 + .s2-2")} + +<===> sibling/and_next_sibling/overlap/output.css +a { + b: .c.s1-1 ~ .c.s2-1 + .s1-2.s2-2, .c.s2-1.s1-1 + .s1-2.s2-2; +} + +<===> +================================================================================ +<===> sibling/and_next_sibling/conflict/input.scss +a {b: selector-unify("#s1-1 ~ .s1-2", "#s2-1 + .s2-2")} + +<===> sibling/and_next_sibling/conflict/output.css +a { + b: #s1-1 ~ #s2-1 + .s1-2.s2-2; +} + +<===> +================================================================================ +<===> next_sibling/and_descendant/input.scss +a {b: selector-unify(".c + .s1", ".c .s2")} + +<===> next_sibling/and_descendant/output.css +a { + b: .c .c + .s1.s2; +} + +<===> +================================================================================ +<===> next_sibling/and_child/input.scss +a {b: selector-unify(".c + .s1", ".c > .s2")} + +<===> next_sibling/and_child/output.css +a { + b: .c > .c + .s1.s2; +} + +<===> +================================================================================ +<===> next_sibling/and_sibling/distinct/input.scss +a {b: selector-unify(".c + .d", ".e ~ .f")} + +<===> next_sibling/and_sibling/distinct/output.css +a { + b: .e ~ .c + .d.f, .e.c + .d.f; +} + +<===> +================================================================================ +<===> next_sibling/and_sibling/identical/input.scss +a {b: selector-unify(".c + .s1", ".c ~ .s2")} + +<===> next_sibling/and_sibling/identical/output.css +a { + b: .c + .s1.s2; +} + +<===> +================================================================================ +<===> next_sibling/and_sibling/superselector/input.scss +a {b: selector-unify(".c.s1-1 + .s1-2", ".c ~ .s2")} + +<===> next_sibling/and_sibling/superselector/output.css +a { + b: .c.s1-1 + .s1-2.s2; +} + +<===> +================================================================================ +<===> next_sibling/and_sibling/overlap/input.scss +a {b: selector-unify(".c.s1-1 + .s1-2", ".c.s2-1 ~ .s2-2")} + +<===> next_sibling/and_sibling/overlap/output.css +a { + b: .c.s2-1 ~ .c.s1-1 + .s1-2.s2-2, .c.s2-1.s1-1 + .s1-2.s2-2; +} + +<===> +================================================================================ +<===> next_sibling/and_sibling/conflict/input.scss +a {b: selector-unify("#s1-1 + .s1-2", "#s2-1 ~ .s2-2")} + +<===> next_sibling/and_sibling/conflict/output.css +a { + b: #s2-1 ~ #s1-1 + .s1-2.s2-2; +} + +<===> +================================================================================ +<===> next_sibling/and_next_sibling/distinct/input.scss +a {b: selector-unify(".c + .d", ".e + .f")} + +<===> next_sibling/and_next_sibling/distinct/output.css +a { + b: .e.c + .d.f; +} + +<===> +================================================================================ +<===> next_sibling/and_next_sibling/superselector/input.scss +a {b: selector-unify(".c.s1-1 + .s1-2", ".c + .s2")} + +<===> next_sibling/and_next_sibling/superselector/output.css +a { + b: .c.s1-1 + .s1-2.s2; +} + +<===> +================================================================================ +<===> next_sibling/and_next_sibling/overlap/input.scss +a {b: selector-unify(".c.s1-1 + .s1-2", ".c.s2-1 + .s2-2")} + +<===> next_sibling/and_next_sibling/overlap/output.css +a { + b: .c.s2-1.s1-1 + .s1-2.s2-2; +} + +<===> +================================================================================ +<===> next_sibling/and_next_sibling/conflict/input.scss +a {b: inspect(selector-unify("#s1-1 + .s1-2", "#s2-1 + .s2-2"))} + +<===> next_sibling/and_next_sibling/conflict/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> initial/README.md +The specific semantics of (explicit) combinators isn't considered when handling +initial combinators, so we cycle through possible combinators in these specs. +Any of these specs should pass with any combination of combinators. + +<===> +================================================================================ +<===> initial/only_one/selector1/input.scss +a {b: selector-unify("> .c", ".d")} + +<===> initial/only_one/selector1/output.css +a { + b: > .c.d; +} + +<===> +================================================================================ +<===> initial/only_one/selector2/input.scss +a {b: selector-unify(".c", "~ .d")} + +<===> initial/only_one/selector2/output.css +a { + b: ~ .c.d; +} + +<===> +================================================================================ +<===> initial/same/input.scss +a {b: selector-unify("+ .c", "+ .d")} + +<===> initial/same/output.css +a { + b: + .c.d; +} + +<===> +================================================================================ +<===> initial/supersequence/contiguous/input.scss +a {b: selector-unify("+ ~ > .c", "> + ~ > > .d")} + +<===> initial/supersequence/contiguous/output.css +a { + b: > + ~ > > .c.d; +} + +<===> +================================================================================ +<===> initial/supersequence/non_contiguous/input.scss +a {b: selector-unify("+ ~ > .c", "+ > ~ ~ > .d")} + +<===> initial/supersequence/non_contiguous/output.css +a { + b: + > ~ ~ > .c.d; +} + +<===> +================================================================================ +<===> initial/different/input.scss +a {b: inspect(selector-unify("+ ~ > .c", "+ > ~ ~ .d"))} + +<===> initial/different/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> multiple/input.scss +a {b: selector-unify(".c > .d + .e", ".f .g ~ .h")} + +<===> multiple/output.css +a { + b: .f .c > .g ~ .d + .e.h, .f .c > .g.d + .e.h; +} + +<===> +================================================================================ +<===> multiple/in_a_row/README.md +The specific semantics of combinators isn't considered when handling multiple +combinators in a row, so we choose combinators for these specs effectively at +random. Any of these specs should pass with any combination of combinators. + +<===> +================================================================================ +<===> multiple/in_a_row/same/input.scss +a {b: selector-unify(".c + ~ > .d", ".e + ~ > .f")} + +<===> multiple/in_a_row/same/output.css +a { + b: .c .e + ~ > .d.f, .e .c + ~ > .d.f; +} + +<===> +================================================================================ +<===> multiple/in_a_row/supersequence/contiguous/input.scss +a {b: selector-unify(".c + ~ > .d", ".e > + ~ > > .f")} + +<===> multiple/in_a_row/supersequence/contiguous/output.css +a { + b: .c .e > + ~ > > .d.f, .e .c > + ~ > > .d.f; +} + +<===> +================================================================================ +<===> multiple/in_a_row/supersequence/non_contiguous/input.scss +a {b: selector-unify(".c + ~ > .d", ".e + > ~ ~ > .f")} + +<===> multiple/in_a_row/supersequence/non_contiguous/output.css +a { + b: .c .e + > ~ ~ > .d.f, .e .c + > ~ ~ > .d.f; +} + +<===> +================================================================================ +<===> multiple/in_a_row/different/input.scss +a {b: inspect(selector-unify(".c + ~ > .d", ".e + > ~ ~ .f"))} + +<===> multiple/in_a_row/different/output.css +a { + b: null; +} diff --git a/spec/core_functions/selector/unify/complex/distinct.hrx b/spec/core_functions/selector/unify/complex/distinct.hrx new file mode 100644 index 0000000000..1e3a123f06 --- /dev/null +++ b/spec/core_functions/selector/unify/complex/distinct.hrx @@ -0,0 +1,17 @@ +<===> two_level/input.scss +a {b: selector-unify(".c .d", ".e .f")} + +<===> two_level/output.css +a { + b: .c .e .d.f, .e .c .d.f; +} + +<===> +================================================================================ +<===> three_level/input.scss +a {b: selector-unify(".c .d .e", ".f .g .h")} + +<===> three_level/output.css +a { + b: .c .d .f .g .e.h, .f .g .c .d .e.h; +} diff --git a/spec/core_functions/selector/unify/complex/identical.hrx b/spec/core_functions/selector/unify/complex/identical.hrx new file mode 100644 index 0000000000..f14505bedf --- /dev/null +++ b/spec/core_functions/selector/unify/complex/identical.hrx @@ -0,0 +1,27 @@ +<===> two_level/input.scss +a {b: selector-unify(".c .s1", ".c .s2")} + +<===> two_level/output.css +a { + b: .c .s1.s2; +} + +<===> +================================================================================ +<===> three_level/outer/input.scss +a {b: selector-unify(".c .s1-1 .s1-2", ".c .s2-1 .s2-2")} + +<===> three_level/outer/output.css +a { + b: .c .s1-1 .s2-1 .s1-2.s2-2, .c .s2-1 .s1-1 .s1-2.s2-2; +} + +<===> +================================================================================ +<===> three_level/inner/input.scss +a {b: selector-unify(".s1-1 .d .s1-2", ".s2-1 .d .s2-2")} + +<===> three_level/inner/output.css +a { + b: .s1-1 .s2-1 .d .s1-2.s2-2, .s2-1 .s1-1 .d .s1-2.s2-2; +} diff --git a/spec/core_functions/selector/unify/complex/lcs.hrx b/spec/core_functions/selector/unify/complex/lcs.hrx new file mode 100644 index 0000000000..3c66a43320 --- /dev/null +++ b/spec/core_functions/selector/unify/complex/lcs.hrx @@ -0,0 +1,48 @@ +<===> README.md +Test the logic for determining the longest common subsequence of parent +selectors that should be unified. "Common" in this case includes superselectors, +where the most specific selector will be chosen as the canonical selector. + +<===> +================================================================================ +<===> two_versus_one/input.scss +// The longest common subsequence is `.c .d`, which is longer than `.e`, so `.c +// .d` gets unified while `.e` gets duplicated. +a {b: selector-unify(".c .d .e .s1", ".e .c .d .s2")} + +<===> two_versus_one/output.css +a { + b: .e .c .d .e .s1.s2; +} + +<===> +================================================================================ +<===> three_versus_two/input.scss +// The longest common subsequence is `.c .d .e`, which is longer than `.f g`, so +// `.c .d .e` gets unified while `.f .g` gets duplicated. +a {b: selector-unify(".c .d .e .f .g .s1", ".f .g .c .d .e .s2")} + +<===> three_versus_two/output.css +a { + b: .f .g .c .d .e .f .g .s1.s2; +} + +<===> +================================================================================ +<===> non_contiguous/same_positions/input.scss +a {b: selector-unify(".s1-1 .c .d .s1-2 .e .s1-3", ".s2-1 .c .d .s2-2 .e .s2-3")} + +<===> non_contiguous/same_positions/output.css +a { + b: .s1-1 .s2-1 .c .d .s1-2 .s2-2 .e .s1-3.s2-3, .s2-1 .s1-1 .c .d .s1-2 .s2-2 .e .s1-3.s2-3, .s1-1 .s2-1 .c .d .s2-2 .s1-2 .e .s1-3.s2-3, .s2-1 .s1-1 .c .d .s2-2 .s1-2 .e .s1-3.s2-3; +} + +<===> +================================================================================ +<===> non_contiguous/different_positions/input.scss +a {b: selector-unify(".s1-1 .c .d .s1-2 .e .s1-3", ".c .s2-1 .d .e .s2-2 .s2-3")} + +<===> non_contiguous/different_positions/output.css +a { + b: .s1-1 .c .s2-1 .d .s1-2 .e .s2-2 .s1-3.s2-3; +} diff --git a/spec/core_functions/selector/unify/complex/overlap.hrx b/spec/core_functions/selector/unify/complex/overlap.hrx new file mode 100644 index 0000000000..7d25376118 --- /dev/null +++ b/spec/core_functions/selector/unify/complex/overlap.hrx @@ -0,0 +1,62 @@ +<===> class/input.scss +// Because neither compound selector containing `.c` is a superselector of the +// other, they aren't unified. +a {b: selector-unify(".c.s1-1 .s1-2", ".c.s2-1 .s2-2")} + +<===> class/output.css +a { + b: .c.s1-1 .c.s2-1 .s1-2.s2-2, .c.s2-1 .c.s1-1 .s1-2.s2-2; +} + +<===> +================================================================================ +<===> id/no_unification/input.scss +a {b: selector-unify("#s1-1.c .s1-2", "#s2-1.c .s2-2")} + +<===> id/no_unification/output.css +a { + b: #s1-1.c #s2-1.c .s1-2.s2-2, #s2-1.c #s1-1.c .s1-2.s2-2; +} + +<===> +================================================================================ +<===> id/forced_unification/input.scss +// Even though neither selector containing `#c` is a superselector of the other, +// they're still unified because the selector can't meainingfully contain two +// instances of `#c`. +a {b: selector-unify("#c.s1-1 .s1-2", "#c.s2-1 .s2-2")} + +<===> id/forced_unification/output.css +a { + b: #c.s2-1.s1-1 .s1-2.s2-2; +} + +<===> id/forced_unification/output-libsass.css +a { + b: #c.s1-1.s2-1 .s1-2.s2-2; +} + +<===> +================================================================================ +<===> pseudo_element/no_unification/input.scss +a {b: selector-unify("::s1-1.c .s1-2", "::s2-1.c .s2-2")} + +<===> pseudo_element/no_unification/output.css +a { + b: ::s1-1.c ::s2-1.c .s1-2.s2-2, ::s2-1.c ::s1-1.c .s1-2.s2-2; +} + +<===> +================================================================================ +<===> pseudo_element/forced_unification/input.scss +a {b: selector-unify(".s1-1::c .s1-2", ".s2-1::c .s2-2")} + +<===> pseudo_element/forced_unification/output.css +a { + b: .s2-1.s1-1::c .s1-2.s2-2; +} + +<===> pseudo_element/forced_unification/output-libsass.css +a { + b: .s1-1.s2-1::c .s1-2.s2-2; +} diff --git a/spec/core_functions/selector/unify/complex/root.hrx b/spec/core_functions/selector/unify/complex/root.hrx new file mode 100644 index 0000000000..69d7e674b0 --- /dev/null +++ b/spec/core_functions/selector/unify/complex/root.hrx @@ -0,0 +1,84 @@ +<===> options.yml +--- +:todo: +- sass/libsass#2071 + +<===> +================================================================================ +<===> in_one/selector1/two_layer/input.scss +a {b: selector-unify(":root .c", ".d .e")} + +<===> in_one/selector1/two_layer/output.css +a { + b: :root .d .c.e; +} + +<===> +================================================================================ +<===> in_one/selector1/three_layer/options.yml +--- +:todo: +- sass/dart-sass#969 + +<===> in_one/selector1/three_layer/input.scss +a {b: selector-unify(":root .c .d", ".e .f")} + +<===> in_one/selector1/three_layer/output.css +a { + b: :root .c .e .d.f, :root .e .c .d.f; +} + +<===> +================================================================================ +<===> in_one/selector2/two_layer/input.scss +a {b: selector-unify(".c .d", ":root .e")} + +<===> in_one/selector2/two_layer/output.css +a { + b: :root .c .d.e; +} + +<===> +================================================================================ +<===> in_one/selector2/three_layer/options.yml +--- +:todo: +- sass/dart-sass#969 + +<===> in_one/selector2/three_layer/input.scss +a {b: selector-unify(".c .d", ":root .e .f")} + +<===> in_one/selector2/three_layer/output.css +a { + b: :root .c .e .d.f, :root .e .c .d.f; +} + +<===> +================================================================================ +<===> in_both/cant_unify/input.scss +a {b: inspect(selector-unify("c:root .d", "e:root .f"))} + +<===> in_both/cant_unify/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> in_both/superselector/input.scss +a {b: selector-unify("c:root .d", ":root .e")} + +<===> in_both/superselector/output.css +a { + b: c:root .d.e; +} + +<===> +================================================================================ +<===> in_both/can_unify/input.scss +a {b: selector-unify(".c:root .d", ".e:root .f")} + +<===> in_both/can_unify/output.css +a { + b: .e.c:root .d.f; +} diff --git a/spec/core_functions/selector/unify/complex/superselector.hrx b/spec/core_functions/selector/unify/complex/superselector.hrx new file mode 100644 index 0000000000..abb38f394a --- /dev/null +++ b/spec/core_functions/selector/unify/complex/superselector.hrx @@ -0,0 +1,27 @@ +<===> two_level/input.scss +a {b: selector-unify(".c.s1-1 .s1-2", ".c .s2")} + +<===> two_level/output.css +a { + b: .c.s1-1 .s1-2.s2; +} + +<===> +================================================================================ +<===> three_level/outer/input.scss +a {b: selector-unify(".c.s1-1 .s1-2 .s1-3", ".c .s2-1 .s2-2")} + +<===> three_level/outer/output.css +a { + b: .c.s1-1 .s1-2 .s2-1 .s1-3.s2-2, .c.s1-1 .s2-1 .s1-2 .s1-3.s2-2; +} + +<===> +================================================================================ +<===> three_level/inner/input.scss +a {b: selector-unify(".s1-1 .c.s1-2 .s1-3", ".s2-1 .c .s2-2")} + +<===> three_level/inner/output.css +a { + b: .s1-1 .s2-1 .c.s1-2 .s1-3.s2-2, .s2-1 .s1-1 .c.s1-2 .s1-3.s2-2; +} diff --git a/spec/core_functions/selector/unify/compound.hrx b/spec/core_functions/selector/unify/compound.hrx new file mode 100644 index 0000000000..a26bbb1155 --- /dev/null +++ b/spec/core_functions/selector/unify/compound.hrx @@ -0,0 +1,87 @@ +<===> no_overlap/input.scss +a {b: selector-unify(".c.d", ".e.f")} + +<===> no_overlap/output.css +a { + b: .c.d.e.f; +} + +<===> +================================================================================ +<===> partial_overlap/input.scss +a {b: selector-unify(".c.d", ".d.e")} + +<===> partial_overlap/output.css +a { + b: .c.d.e; +} + +<===> +================================================================================ +<===> full_overlap/input.scss +a {b: selector-unify(".c.d", ".c.d")} + +<===> full_overlap/output.css +a { + b: .c.d; +} + +<===> +================================================================================ +<===> order/preserved_by_default/input.scss +a {b: selector-unify(".c.d", ".e.f")} + +<===> order/preserved_by_default/output.css +a { + b: .c.d.e.f; +} + +<===> +================================================================================ +<===> order/element_at_start/input.scss +a {b: selector-unify(".c", "d")} + +<===> order/element_at_start/output.css +a { + b: d.c; +} + +<===> +================================================================================ +<===> order/pseudo_element_at_end/input.scss +a {b: selector-unify("::c", ".d")} + +<===> order/pseudo_element_at_end/output.css +a { + b: .d::c; +} + +<===> +================================================================================ +<===> order/pseudo_class_at_end/input.scss +a {b: selector-unify(":c", ".d")} + +<===> order/pseudo_class_at_end/output.css +a { + b: .d:c; +} + +<===> +================================================================================ +<===> order/pseudo_element_after_pseudo_class/element_first/input.scss +a {b: selector-unify("::c", ":d")} + +<===> order/pseudo_element_after_pseudo_class/element_first/output.css +a { + b: :d::c; +} + +<===> +================================================================================ +<===> order/pseudo_element_after_pseudo_class/class_first/input.scss +a {b: selector-unify(":c", "::d")} + +<===> order/pseudo_element_after_pseudo_class/class_first/output.css +a { + b: :c::d; +} diff --git a/spec/core_functions/selector/unify/error.hrx b/spec/core_functions/selector/unify/error.hrx new file mode 100644 index 0000000000..99d5e76ec3 --- /dev/null +++ b/spec/core_functions/selector/unify/error.hrx @@ -0,0 +1,139 @@ +<===> selector1/parent/input.scss +a {b: selector-unify("&", "c")} + +<===> selector1/parent/error +Error: $selector1: Parent selectors aren't allowed here. + , +1 | & + | ^ + ' + - 1:1 root stylesheet + , +1 | a {b: selector-unify("&", "c")} + | ^^^^^^^^^^^^^^^^^^^^^^^^ + ' + input.scss 1:7 root stylesheet + +<===> selector1/parent/error-libsass +Error: Parent selectors aren't allowed here. + on line 1:22 of input.scss, in function `selector-unify` + from line 1:7 of input.scss +>> a {b: selector-unify("&", "c")} + + ---------------------^ + +<===> +================================================================================ +<===> selector1/invalid/input.scss +a {b: selector-unify("[c", "d")} + +<===> selector1/invalid/error +Error: $selector1: expected more input. + , +1 | [c + | ^ + ' + - 1:3 root stylesheet + , +1 | a {b: selector-unify("[c", "d")} + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + ' + input.scss 1:7 root stylesheet + +<===> selector1/invalid/error-libsass +Error: invalid operator in attribute selector for c + on line 1:23 of input.scss, in function `selector-unify` + from line 1:7 of input.scss +>> a {b: selector-unify("[c", "d")} + + ----------------------^ + +<===> +================================================================================ +<===> selector1/type/options.yml +--- +:todo: +- sass/libsass#2964 + +<===> selector1/type/input.scss +a {b: selector-unify(1, "c")} + +<===> selector1/type/error +Error: $selector1: 1 is not a valid selector: it must be a string, +a list of strings, or a list of lists of strings. + , +1 | a {b: selector-unify(1, "c")} + | ^^^^^^^^^^^^^^^^^^^^^^ + ' + input.scss 1:7 root stylesheet + +<===> +================================================================================ +<===> selector2/parent/input.scss +a {b: selector-unify("c", "&")} + +<===> selector2/parent/error +Error: $selector2: Parent selectors aren't allowed here. + , +1 | & + | ^ + ' + - 1:1 root stylesheet + , +1 | a {b: selector-unify("c", "&")} + | ^^^^^^^^^^^^^^^^^^^^^^^^ + ' + input.scss 1:7 root stylesheet + +<===> selector2/parent/error-libsass +Error: Parent selectors aren't allowed here. + on line 1:27 of input.scss, in function `selector-unify` + from line 1:7 of input.scss +>> a {b: selector-unify("c", "&")} + + --------------------------^ + +<===> +================================================================================ +<===> selector2/invalid/input.scss +a {b: selector-unify("c", "[d")} + +<===> selector2/invalid/error +Error: $selector2: expected more input. + , +1 | [d + | ^ + ' + - 1:3 root stylesheet + , +1 | a {b: selector-unify("c", "[d")} + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + ' + input.scss 1:7 root stylesheet + +<===> selector2/invalid/error-libsass +Error: invalid operator in attribute selector for d + on line 1:28 of input.scss, in function `selector-unify` + from line 1:7 of input.scss +>> a {b: selector-unify("c", "[d")} + + ---------------------------^ + +<===> +================================================================================ +<===> selector2/type/options.yml +--- +:todo: +- sass/libsass#2964 + +<===> selector2/type/input.scss +a {b: selector-unify("c", 1)} + +<===> selector2/type/error +Error: $selector2: 1 is not a valid selector: it must be a string, +a list of strings, or a list of lists of strings. + , +1 | a {b: selector-unify("c", 1)} + | ^^^^^^^^^^^^^^^^^^^^^^ + ' + input.scss 1:7 root stylesheet diff --git a/spec/core_functions/selector/unify/format.hrx b/spec/core_functions/selector/unify/format.hrx new file mode 100644 index 0000000000..7c721e51ff --- /dev/null +++ b/spec/core_functions/selector/unify/format.hrx @@ -0,0 +1,50 @@ +<===> input/non_string/README.md +These specs verify that all the arguments to `selector-unify()` can take the +parsed selector format, and that the function returns a selector in that format. +The full set of possible input formats is tested with `selector-parse()`; this +spec just verifies one example for each parameter. + +<===> +================================================================================ +<===> input/non_string/selector1/input.scss +a {b: selector-unify((c, d c), ".e")} + +<===> input/non_string/selector1/output.css +a { + b: c.e, d c.e; +} + +<===> +================================================================================ +<===> input/non_string/selector2/input.scss +a {b: selector-unify(".e", (c, d c))} + +<===> input/non_string/selector2/output.css +a { + b: c.e, d c.e; +} + +<===> +================================================================================ +<===> input/two_lists/input.scss +a {b: selector-unify(".c, .d", ".e, .f")} + +<===> input/two_lists/output.css +a { + b: .c.e, .c.f, .d.e, .d.f; +} + +<===> +================================================================================ +<===> output/input.scss +$result: selector-unify("c d, e f", ".g"); +a { + result: $result; + structure: $result == ("c" "d.g", "e" "f.g"); +} + +<===> output/output.css +a { + result: c d.g, e f.g; + structure: true; +} diff --git a/spec/core_functions/selector/unify/simple/attribute.hrx b/spec/core_functions/selector/unify/simple/attribute.hrx new file mode 100644 index 0000000000..f2f1e685cd --- /dev/null +++ b/spec/core_functions/selector/unify/simple/attribute.hrx @@ -0,0 +1,17 @@ +<===> same/input.scss +a {b: selector-unify("[c]", "[c]")} + +<===> same/output.css +a { + b: [c]; +} + +<===> +================================================================================ +<===> different/input.scss +a {b: selector-unify("[c]", "[d]")} + +<===> different/output.css +a { + b: [c][d]; +} diff --git a/spec/core_functions/selector/unify/simple/class.hrx b/spec/core_functions/selector/unify/simple/class.hrx new file mode 100644 index 0000000000..df971e9b32 --- /dev/null +++ b/spec/core_functions/selector/unify/simple/class.hrx @@ -0,0 +1,17 @@ +<===> same/input.scss +a {b: selector-unify(".c", ".c")} + +<===> same/output.css +a { + b: .c; +} + +<===> +================================================================================ +<===> different/input.scss +a {b: selector-unify(".c", ".d")} + +<===> different/output.css +a { + b: .c.d; +} diff --git a/spec/core_functions/selector/unify/simple/different_types.hrx b/spec/core_functions/selector/unify/simple/different_types.hrx new file mode 100644 index 0000000000..9dd5a7282e --- /dev/null +++ b/spec/core_functions/selector/unify/simple/different_types.hrx @@ -0,0 +1,7 @@ +<===> input.scss +a {b: selector-unify("c", "#d")} + +<===> output.css +a { + b: c#d; +} diff --git a/spec/core_functions/selector/unify/simple/id.hrx b/spec/core_functions/selector/unify/simple/id.hrx new file mode 100644 index 0000000000..a00ed2b879 --- /dev/null +++ b/spec/core_functions/selector/unify/simple/id.hrx @@ -0,0 +1,17 @@ +<===> same/input.scss +a {b: selector-unify("#c", "#c")} + +<===> same/output.css +a { + b: #c; +} + +<===> +================================================================================ +<===> different/input.scss +a {b: inspect(selector-unify("#c", "#d"))} + +<===> different/output.css +a { + b: null; +} diff --git a/spec/core_functions/selector/unify/simple/placeholder.hrx b/spec/core_functions/selector/unify/simple/placeholder.hrx new file mode 100644 index 0000000000..b5043d4d00 --- /dev/null +++ b/spec/core_functions/selector/unify/simple/placeholder.hrx @@ -0,0 +1,17 @@ +<===> same/input.scss +a {b: selector-unify("%c", "%c")} + +<===> same/output.css +a { + b: %c; +} + +<===> +================================================================================ +<===> different/input.scss +a {b: selector-unify("%c", "%d")} + +<===> different/output.css +a { + b: %c%d; +} diff --git a/spec/core_functions/selector/unify/simple/pseudo.hrx b/spec/core_functions/selector/unify/simple/pseudo.hrx new file mode 100644 index 0000000000..22573ec5db --- /dev/null +++ b/spec/core_functions/selector/unify/simple/pseudo.hrx @@ -0,0 +1,144 @@ +<===> no_arg/class/same/input.scss +a {b: selector-unify(":c", ":c")} + +<===> no_arg/class/same/output.css +a { + b: :c; +} + +<===> +================================================================================ +<===> no_arg/class/different/input.scss +a {b: selector-unify(":c", ":d")} + +<===> no_arg/class/different/output.css +a { + b: :c:d; +} + +<===> +================================================================================ +<===> no_arg/element/same/input.scss +a {b: selector-unify("::c", "::c")} + +<===> no_arg/element/same/output.css +a { + b: ::c; +} + +<===> +================================================================================ +<===> no_arg/element/different/input.scss +a {b: inspect(selector-unify("::c", "::d"))} + +<===> no_arg/element/different/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> no_arg/different_syntax_same_semantics/before/input.scss +a {b: selector-unify(":before", "::before")} + +<===> no_arg/different_syntax_same_semantics/before/output.css +a { + b: :before; +} + +<===> +================================================================================ +<===> no_arg/different_syntax_same_semantics/after/input.scss +a {b: selector-unify(":after", "::after")} + +<===> no_arg/different_syntax_same_semantics/after/output.css +a { + b: :after; +} + +<===> +================================================================================ +<===> no_arg/different_syntax_same_semantics/first_line/input.scss +a {b: selector-unify(":first-line", "::first-line")} + +<===> no_arg/different_syntax_same_semantics/first_line/output.css +a { + b: :first-line; +} + +<===> +================================================================================ +<===> no_arg/different_syntax_same_semantics/first_letter/input.scss +a {b: selector-unify(":first-letter", "::first-letter")} + +<===> no_arg/different_syntax_same_semantics/first_letter/output.css +a { + b: :first-letter; +} + +<===> +================================================================================ +<===> arg/options.yml +--- +:todo: +- sass/libsass#3068 + +<===> +================================================================================ +<===> arg/class/same/input.scss +a {b: selector-unify(":c(@#$)", ":c(@#$)")} + +<===> arg/class/same/output.css +a { + b: :c(@#$); +} + +<===> +================================================================================ +<===> arg/class/different/input.scss +a {b: selector-unify(":c(@#$)", ":c(*&^)")} + +<===> arg/class/different/output.css +a { + b: :c(@#$):c(*&^); +} + +<===> +================================================================================ +<===> arg/element/same/input.scss +a {b: selector-unify("::c(@#$)", "::c(@#$)")} + +<===> arg/element/same/output.css +a { + b: ::c(@#$); +} + +<===> +================================================================================ +<===> arg/element/different/input.scss +a {b: inspect(selector-unify("::c(@#$)", "::c(*&^)"))} + +<===> arg/element/different/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> selector_arg/same/input.scss +a {b: selector-unify(":matches(.c)", ":matches(.c)")} + +<===> selector_arg/same/output.css +a { + b: :matches(.c); +} + +<===> +================================================================================ +<===> selector_arg/different/input.scss +a {b: selector-unify(":matches(.c)", ":matches(.d)")} + +<===> selector_arg/different/output.css +a { + b: :matches(.c):matches(.d); +} diff --git a/spec/core_functions/selector/unify/simple/type.hrx b/spec/core_functions/selector/unify/simple/type.hrx new file mode 100644 index 0000000000..8222513927 --- /dev/null +++ b/spec/core_functions/selector/unify/simple/type.hrx @@ -0,0 +1,437 @@ +<===> and_type/default/and_explicit/input.scss +a {b: inspect(selector-unify("c", "d|c"))} + +<===> and_type/default/and_explicit/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_type/default/and_empty/input.scss +a {b: inspect(selector-unify("c", "|c"))} + +<===> and_type/default/and_empty/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_type/default/and_default/same/input.scss +a {b: selector-unify("c", "c")} + +<===> and_type/default/and_default/same/output.css +a { + b: c; +} + +<===> +================================================================================ +<===> and_type/default/and_default/different/input.scss +a {b: inspect(selector-unify("c", "d"))} + +<===> and_type/default/and_default/different/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_type/default/and_any/same_type/input.scss +a {b: selector-unify("c", "*|c")} + +<===> and_type/default/and_any/same_type/output.css +a { + b: c; +} + +<===> +================================================================================ +<===> and_type/default/and_any/different_type/input.scss +a {b: inspect(selector-unify("c", "*|d"))} + +<===> and_type/default/and_any/different_type/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_type/explicit/and_explicit/same/input.scss +a {b: selector-unify("c|d", "c|d")} + +<===> and_type/explicit/and_explicit/same/output.css +a { + b: c|d; +} + +<===> +================================================================================ +<===> and_type/explicit/and_explicit/different/namespace/input.scss +a {b: inspect(selector-unify("c|d", "e|d"))} + +<===> and_type/explicit/and_explicit/different/namespace/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_type/explicit/and_explicit/different/type/input.scss +a {b: inspect(selector-unify("c|d", "c|e"))} + +<===> and_type/explicit/and_explicit/different/type/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_type/explicit/and_empty/input.scss +a {b: inspect(selector-unify("c|d", "|d"))} + +<===> and_type/explicit/and_empty/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_type/explicit/and_default/input.scss +a {b: inspect(selector-unify("c|d", "d"))} + +<===> and_type/explicit/and_default/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_type/explicit/and_any/same_type/input.scss +a {b: selector-unify("c|d", "*|d")} + +<===> and_type/explicit/and_any/same_type/output.css +a { + b: c|d; +} + +<===> +================================================================================ +<===> and_type/explicit/and_any/different_type/input.scss +a {b: inspect(selector-unify("c|d", "*|e"))} + +<===> and_type/explicit/and_any/different_type/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_type/empty/and_explicit/input.scss +a {b: inspect(selector-unify("|c", "e|c"))} + +<===> and_type/empty/and_explicit/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_type/empty/and_empty/same/input.scss +a {b: selector-unify("|c", "|c")} + +<===> and_type/empty/and_empty/same/output.css +a { + b: |c; +} + +<===> +================================================================================ +<===> and_type/empty/and_empty/different/input.scss +a {b: inspect(selector-unify("|c", "|d"))} + +<===> and_type/empty/and_empty/different/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_type/empty/and_default/input.scss +a {b: inspect(selector-unify("|c", "c"))} + +<===> and_type/empty/and_default/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_type/empty/and_any/same_type/input.scss +a {b: selector-unify("|c", "*|c")} + +<===> and_type/empty/and_any/same_type/output.css +a { + b: |c; +} + +<===> +================================================================================ +<===> and_type/empty/and_any/different_type/input.scss +a {b: selector-unify("|c", "*|c")} + +<===> and_type/empty/and_any/different_type/output.css +a { + b: |c; +} + +<===> +================================================================================ +<===> and_type/any/and_explicit/same_type/input.scss +a {b: selector-unify("*|c", "d|c")} + +<===> and_type/any/and_explicit/same_type/output.css +a { + b: d|c; +} + +<===> +================================================================================ +<===> and_type/any/and_explicit/different_type/input.scss +a {b: inspect(selector-unify("*|c", "d|e"))} + +<===> and_type/any/and_explicit/different_type/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_type/any/and_empty/same_type/input.scss +a {b: selector-unify("*|c", "|c")} + +<===> and_type/any/and_empty/same_type/output.css +a { + b: |c; +} + +<===> +================================================================================ +<===> and_type/any/and_empty/different_type/input.scss +a {b: inspect(selector-unify("*|c", "|d"))} + +<===> and_type/any/and_empty/different_type/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_type/any/and_default/same_type/input.scss +a {b: selector-unify("*|c", "c")} + +<===> and_type/any/and_default/same_type/output.css +a { + b: c; +} + +<===> +================================================================================ +<===> and_type/any/and_default/different_type/input.scss +a {b: inspect(selector-unify("*|c", "d"))} + +<===> and_type/any/and_default/different_type/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_type/any/and_any/same/input.scss +a {b: selector-unify("*|c", "*|c")} + +<===> and_type/any/and_any/same/output.css +a { + b: *|c; +} + +<===> +================================================================================ +<===> and_type/any/and_any/different/input.scss +a {b: inspect(selector-unify("*|c", "*|d"))} + +<===> and_type/any/and_any/different/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_universal/default/and_explicit/input.scss +a {b: inspect(selector-unify("c", "e|*"))} + +<===> and_universal/default/and_explicit/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_universal/default/and_empty/input.scss +a {b: inspect(selector-unify("c", "|*"))} + +<===> and_universal/default/and_empty/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_universal/default/and_default/input.scss +a {b: selector-unify("c", "*")} + +<===> and_universal/default/and_default/output.css +a { + b: c; +} + +<===> +================================================================================ +<===> and_universal/default/and_any/input.scss +a {b: selector-unify("c", "*|*")} + +<===> and_universal/default/and_any/output.css +a { + b: c; +} + +<===> +================================================================================ +<===> and_universal/explicit/and_explicit/same/input.scss +a {b: selector-unify("c|d", "c|*")} + +<===> and_universal/explicit/and_explicit/same/output.css +a { + b: c|d; +} + +<===> +================================================================================ +<===> and_universal/explicit/and_explicit/different/input.scss +a {b: inspect(selector-unify("c|d", "e|*"))} + +<===> and_universal/explicit/and_explicit/different/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_universal/explicit/and_empty/input.scss +a {b: inspect(selector-unify("c|d", "|*"))} + +<===> and_universal/explicit/and_empty/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_universal/explicit/and_default/input.scss +a {b: inspect(selector-unify("c|d", "*"))} + +<===> and_universal/explicit/and_default/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_universal/explicit/and_any/input.scss +a {b: selector-unify("c|d", "*|*")} + +<===> and_universal/explicit/and_any/output.css +a { + b: c|d; +} + +<===> +================================================================================ +<===> and_universal/empty/and_explicit/input.scss +a {b: inspect(selector-unify("|c", "e|*"))} + +<===> and_universal/empty/and_explicit/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_universal/empty/and_empty/input.scss +a {b: selector-unify("|c", "|*")} + +<===> and_universal/empty/and_empty/output.css +a { + b: |c; +} + +<===> +================================================================================ +<===> and_universal/empty/and_default/input.scss +a {b: inspect(selector-unify("|c", "*"))} + +<===> and_universal/empty/and_default/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_universal/empty/and_any/input.scss +a {b: selector-unify("|c", "*|*")} + +<===> and_universal/empty/and_any/output.css +a { + b: |c; +} + +<===> +================================================================================ +<===> and_universal/any/and_explicit/input.scss +a {b: selector-unify("*|c", "d|*")} + +<===> and_universal/any/and_explicit/output.css +a { + b: d|c; +} + +<===> +================================================================================ +<===> and_universal/any/and_empty/input.scss +a {b: selector-unify("*|c", "|*")} + +<===> and_universal/any/and_empty/output.css +a { + b: |c; +} + +<===> +================================================================================ +<===> and_universal/any/and_default/input.scss +a {b: selector-unify("*|c", "*")} + +<===> and_universal/any/and_default/output.css +a { + b: c; +} + +<===> +================================================================================ +<===> and_universal/any/and_any/input.scss +a {b: selector-unify("*|c", "*|*")} + +<===> and_universal/any/and_any/output.css +a { + b: *|c; +} diff --git a/spec/core_functions/selector/unify/simple/universal.hrx b/spec/core_functions/selector/unify/simple/universal.hrx new file mode 100644 index 0000000000..c4098a3e92 --- /dev/null +++ b/spec/core_functions/selector/unify/simple/universal.hrx @@ -0,0 +1,327 @@ +<===> and_type/default/and_explicit/input.scss +a {b: inspect(selector-unify("*", "c|d"))} + +<===> and_type/default/and_explicit/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_type/default/and_empty/input.scss +a {b: inspect(selector-unify("*", "|c"))} + +<===> and_type/default/and_empty/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_type/default/and_default/input.scss +a {b: selector-unify("*", "c")} + +<===> and_type/default/and_default/output.css +a { + b: c; +} + +<===> +================================================================================ +<===> and_type/default/and_any/input.scss +a {b: selector-unify("*", "*|c")} + +<===> and_type/default/and_any/output.css +a { + b: c; +} + +<===> +================================================================================ +<===> and_type/explicit/and_explicit/same/input.scss +a {b: selector-unify("c|*", "c|d")} + +<===> and_type/explicit/and_explicit/same/output.css +a { + b: c|d; +} + +<===> +================================================================================ +<===> and_type/explicit/and_explicit/different/input.scss +a {b: inspect(selector-unify("c|*", "d|e"))} + +<===> and_type/explicit/and_explicit/different/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_type/explicit/and_empty/input.scss +a {b: inspect(selector-unify("c|*", "|d"))} + +<===> and_type/explicit/and_empty/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_type/explicit/and_default/input.scss +a {b: inspect(selector-unify("c|*", "d"))} + +<===> and_type/explicit/and_default/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_type/explicit/and_any/input.scss +a {b: selector-unify("c|*", "*|d")} + +<===> and_type/explicit/and_any/output.css +a { + b: c|d; +} + +<===> +================================================================================ +<===> and_type/empty/and_explicit/input.scss +a {b: inspect(selector-unify("|*", "c|d"))} + +<===> and_type/empty/and_explicit/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_type/empty/and_empty/input.scss +a {b: selector-unify("|*", "|c")} + +<===> and_type/empty/and_empty/output.css +a { + b: |c; +} + +<===> +================================================================================ +<===> and_type/empty/and_default/input.scss +a {b: inspect(selector-unify("|*", "c"))} + +<===> and_type/empty/and_default/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_type/empty/and_any/input.scss +a {b: selector-unify("|*", "*|c")} + +<===> and_type/empty/and_any/output.css +a { + b: |c; +} + +<===> +================================================================================ +<===> and_type/any/and_explicit/input.scss +a {b: selector-unify("*|*", "c|d")} + +<===> and_type/any/and_explicit/output.css +a { + b: c|d; +} + +<===> +================================================================================ +<===> and_type/any/and_empty/input.scss +a {b: selector-unify("*|*", "|c")} + +<===> and_type/any/and_empty/output.css +a { + b: |c; +} + +<===> +================================================================================ +<===> and_type/any/and_default/input.scss +a {b: selector-unify("*|*", "c")} + +<===> and_type/any/and_default/output.css +a { + b: c; +} + +<===> +================================================================================ +<===> and_type/any/and_any/input.scss +a {b: selector-unify("*|*", "*|c")} + +<===> and_type/any/and_any/output.css +a { + b: *|c; +} + +<===> +================================================================================ +<===> and_universal/default/and_explicit/input.scss +a {b: inspect(selector-unify("*", "e|*"))} + +<===> and_universal/default/and_explicit/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_universal/default/and_empty/input.scss +a {b: inspect(selector-unify("*", "|*"))} + +<===> and_universal/default/and_empty/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_universal/default/and_default/input.scss +a {b: selector-unify("*", "*")} + +<===> and_universal/default/and_default/output.css +a { + b: *; +} + +<===> +================================================================================ +<===> and_universal/default/and_any/input.scss +a {b: selector-unify("*", "*|*")} + +<===> and_universal/default/and_any/output.css +a { + b: *; +} + +<===> +================================================================================ +<===> and_universal/explicit/and_explicit/input.scss +a {b: selector-unify("c|*", "c|*")} + +<===> and_universal/explicit/and_explicit/output.css +a { + b: c|*; +} + +<===> +================================================================================ +<===> and_universal/explicit/and_empty/input.scss +a {b: inspect(selector-unify("c|*", "|*"))} + +<===> and_universal/explicit/and_empty/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_universal/explicit/and_default/input.scss +a {b: inspect(selector-unify("c|*", "*"))} + +<===> and_universal/explicit/and_default/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_universal/explicit/and_any/input.scss +a {b: selector-unify("c|*", "*|*")} + +<===> and_universal/explicit/and_any/output.css +a { + b: c|*; +} + +<===> +================================================================================ +<===> and_universal/empty/and_explicit/input.scss +a {b: inspect(selector-unify("|*", "e|*"))} + +<===> and_universal/empty/and_explicit/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_universal/empty/and_empty/input.scss +a {b: selector-unify("|*", "|*")} + +<===> and_universal/empty/and_empty/output.css +a { + b: |*; +} + +<===> +================================================================================ +<===> and_universal/empty/and_default/input.scss +a {b: inspect(selector-unify("|*", "*"))} + +<===> and_universal/empty/and_default/output.css +a { + b: null; +} + +<===> +================================================================================ +<===> and_universal/empty/and_any/input.scss +a {b: selector-unify("|*", "*|*")} + +<===> and_universal/empty/and_any/output.css +a { + b: |*; +} + +<===> +================================================================================ +<===> and_universal/any/and_explicit/input.scss +a {b: selector-unify("*|*", "c|*")} + +<===> and_universal/any/and_explicit/output.css +a { + b: c|*; +} + +<===> +================================================================================ +<===> and_universal/any/and_empty/input.scss +a {b: selector-unify("*|*", "|*")} + +<===> and_universal/any/and_empty/output.css +a { + b: |*; +} + +<===> +================================================================================ +<===> and_universal/any/and_default/input.scss +a {b: selector-unify("*|*", "*")} + +<===> and_universal/any/and_default/output.css +a { + b: *; +} + +<===> +================================================================================ +<===> and_universal/any/and_any/input.scss +a {b: selector-unify("*|*", "*|*")} + +<===> and_universal/any/and_any/output.css +a { + b: *|*; +}