175 lines
5 KiB
Go
175 lines
5 KiB
Go
package css
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/stretchr/testify/assert"
|
|
"testing"
|
|
)
|
|
|
|
func TestMultipleSelectors(t *testing.T) {
|
|
css := Parse(`div .a {
|
|
font-size: 150%;
|
|
}
|
|
p .b {
|
|
font-size: 250%;
|
|
}`)
|
|
|
|
assert.Equal(t, css.CssRuleList[0].Style.SelectorText, "div .a")
|
|
assert.Equal(t, css.CssRuleList[1].Style.SelectorText, "p .b")
|
|
|
|
}
|
|
|
|
func TestIdSelector(t *testing.T) {
|
|
css := Parse("#div { color: red;}")
|
|
|
|
assert.Equal(t, css.CssRuleList[0].Style.Styles["color"].Value, "red")
|
|
assert.Equal(t, css.CssRuleList[0].Style.SelectorText, "#div")
|
|
}
|
|
|
|
func TestClassSelector(t *testing.T) {
|
|
css := Parse(".div { color: green;}")
|
|
|
|
assert.Equal(t, css.CssRuleList[0].Style.Styles["color"].Value, "green")
|
|
assert.Equal(t, css.CssRuleList[0].Style.SelectorText, ".div")
|
|
}
|
|
|
|
func TestStarSelector(t *testing.T) {
|
|
css := Parse("* { text-rendering: optimizelegibility; }")
|
|
|
|
assert.Equal(t, "optimizelegibility", css.CssRuleList[0].Style.Styles["text-rendering"].Value)
|
|
assert.Equal(t, css.CssRuleList[0].Style.SelectorText, "*")
|
|
}
|
|
|
|
func TestStarSelectorMulti(t *testing.T) {
|
|
css := Parse(`div .a {
|
|
font-size: 150%;
|
|
}
|
|
* { text-rendering: optimizelegibility; }`)
|
|
|
|
assert.Equal(t, "150%", css.CssRuleList[0].Style.Styles["font-size"].Value)
|
|
assert.Equal(t, css.CssRuleList[0].Style.SelectorText, "div .a")
|
|
|
|
assert.Equal(t, "optimizelegibility", css.CssRuleList[1].Style.Styles["text-rendering"].Value)
|
|
assert.Equal(t, css.CssRuleList[1].Style.SelectorText, "*")
|
|
}
|
|
|
|
func TestMixedClassSelectors(t *testing.T) {
|
|
selectors := []string{".footer__content_wrapper--last",
|
|
"table[class=\"body\"] .footer__content td",
|
|
"table[class=\"body\"] td.footer__link_wrapper--first",
|
|
"table[class=\"body\"] td.footer__link_wrapper--last"}
|
|
|
|
for _, selector := range selectors {
|
|
css := Parse(fmt.Sprintf(` %s {
|
|
border-collapse: separate;
|
|
padding: 10px 0 0
|
|
}`, selector))
|
|
|
|
assert.Equal(t, "separate", css.CssRuleList[0].Style.Styles["border-collapse"].Value)
|
|
assert.Equal(t, "10px 0 0", css.CssRuleList[0].Style.Styles["padding"].Value)
|
|
assert.Equal(t, css.CssRuleList[0].Style.SelectorText, selector)
|
|
}
|
|
}
|
|
|
|
func TestGenericSelectors(t *testing.T) {
|
|
selectors := []string{
|
|
"p ~ ul",
|
|
"div > p",
|
|
"div > p",
|
|
"div p",
|
|
"div, p",
|
|
"[target]",
|
|
"[target=_blank]",
|
|
"[title~=flower]",
|
|
"[lang|=en]",
|
|
"a[href^=\"https\"]",
|
|
"a[href$=\".pdf\"]",
|
|
"a[href*=\"css\"]",
|
|
".header + .content",
|
|
"#firstname",
|
|
"table[class=\"body\"] .footer__content td",
|
|
"table[class=\"body\"] td.footer__link_wrapper--first"}
|
|
|
|
for _, selector := range selectors {
|
|
css := Parse(fmt.Sprintf(` %s {
|
|
border-collapse: separate;
|
|
padding: 10px 0 0
|
|
}`, selector))
|
|
|
|
assert.Equal(t, "separate", css.CssRuleList[0].Style.Styles["border-collapse"].Value)
|
|
assert.Equal(t, "10px 0 0", css.CssRuleList[0].Style.Styles["padding"].Value)
|
|
assert.Equal(t, css.CssRuleList[0].Style.SelectorText, selector)
|
|
}
|
|
}
|
|
|
|
func TestFilterSelectors(t *testing.T) {
|
|
selectors := []string{
|
|
"a:active",
|
|
"p::after",
|
|
"p::before",
|
|
"input:checked",
|
|
"input:disabled",
|
|
"input:in-range",
|
|
"input:invalid",
|
|
"input:optional",
|
|
"input:read-only",
|
|
"input:enabled",
|
|
"p:empty",
|
|
"p:first-child",
|
|
"p::first-letter",
|
|
"p::first-line",
|
|
"p:first-of-type",
|
|
"input:focus",
|
|
"a:hover",
|
|
"p:lang(it)",
|
|
"p:last-child",
|
|
"p:last-of-type",
|
|
"a:link",
|
|
":not(p)",
|
|
"p:nth-child(2)",
|
|
"p:nth-last-child(2)",
|
|
"p:only-of-type",
|
|
"p:only-child",
|
|
"p:nth-last-of-type(2)",
|
|
"div:not(:nth-child(1))",
|
|
"div:not(:not(:first-child))",
|
|
":root",
|
|
"::selection",
|
|
"#news:target"}
|
|
|
|
for _, selector := range selectors {
|
|
css := Parse(fmt.Sprintf(` %s {
|
|
border-collapse: separate;
|
|
padding: 10px 0 0
|
|
}`, selector))
|
|
|
|
assert.Equal(t, "separate", css.CssRuleList[0].Style.Styles["border-collapse"].Value)
|
|
assert.Equal(t, "10px 0 0", css.CssRuleList[0].Style.Styles["padding"].Value)
|
|
assert.Equal(t, css.CssRuleList[0].Style.SelectorText, selector)
|
|
}
|
|
}
|
|
|
|
func TestFontFace(t *testing.T) {
|
|
css := Parse(`@font-face {
|
|
font-family: "Bitstream Vera Serif Bold";
|
|
src: url("https://mdn.mozillademos.org/files/2468/VeraSeBd.ttf");
|
|
}
|
|
|
|
body { font-family: "Bitstream Vera Serif Bold", serif }`)
|
|
|
|
assert.Equal(t, css.CssRuleList[0].Style.SelectorText, "")
|
|
assert.Equal(t, css.CssRuleList[0].Style.Styles["font-family"].Value, "\"Bitstream Vera Serif Bold\"")
|
|
assert.Equal(t, css.CssRuleList[0].Style.Styles["src"].Value, "url(\"https://mdn.mozillademos.org/files/2468/VeraSeBd.ttf\")")
|
|
assert.Equal(t, css.CssRuleList[1].Style.Styles["font-family"].Value, "\"Bitstream Vera Serif Bold\", serif")
|
|
assert.Equal(t, css.CssRuleList[0].Type, FONT_FACE_RULE)
|
|
}
|
|
|
|
func TestPage(t *testing.T) {
|
|
css := Parse(`@page :first {
|
|
margin: 2in 3in;
|
|
}`)
|
|
|
|
assert.Equal(t, css.CssRuleList[0].Style.SelectorText, ":first")
|
|
assert.Equal(t, css.CssRuleList[0].Style.Styles["margin"].Value, "2in 3in")
|
|
assert.Equal(t, css.CssRuleList[0].Type, PAGE_RULE)
|
|
}
|