<commit_before>package tornadofx

import javafx.scene.layout.Pane
import javafx.scene.paint.*
import javafx.scene.text.Font
import javafx.scene.text.FontWeight
import org.junit.Assert
import org.junit.Test
import tornadofx.Stylesheet.Companion.armed
import tornadofx.Stylesheet.Companion.hover
import tornadofx.Stylesheet.Companion.label
import kotlin.test.assertEquals

class StylesheetTests {
    val vbox by cssclass()
    val wrapper by cssclass()

    val text by cssclass()
    val box by cssclass()

    val a by cssclass()
    val b by cssclass()
    val c by cssclass()
    val d by cssclass()
    val e by cssclass()
    val f by cssclass()
    val g by cssclass()
    val h by cssclass()
    val i by cssclass()

    @Test
    fun cartesian() {
        stylesheet {
            s(a, b, c) {
                s(d, e, f) {
                    s(g, h, i) {
                        textFill = Color.BLUE
                    }
                }
            }
        } shouldEqual {
            """
            .a .d .g, .a .d .h, .a .d .i, .a .e .g, .a .e .h, .a .e .i, .a .f .g, .a .f .h, .a .f .i, .b .d .g, .b .d .h, .b .d .i, .b .e .g, .b .e .h, .b .e .i, .b .f .g, .b .f .h, .b .f .i, .c .d .g, .c .d .h, .c .d .i, .c .e .g, .c .e .h, .c .e .i, .c .f .g, .c .f .h, .c .f .i {
                -fx-text-fill: rgba(0, 0, 255, 1);
            }
            """
        }

        stylesheet {
            s(a, b, c) {
                +s(d, e, f) {
                    +s(g, h, i) {
                        textFill = Color.BLUE
                    }
                }
            }
        } shouldEqual {
            """
            .a.d.g, .a.d.h, .a.d.i, .a.e.g, .a.e.h, .a.e.i, .a.f.g, .a.f.h, .a.f.i, .b.d.g, .b.d.h, .b.d.i, .b.e.g, .b.e.h, .b.e.i, .b.f.g, .b.f.h, .b.f.i, .c.d.g, .c.d.h, .c.d.i, .c.e.g, .c.e.h, .c.e.i, .c.f.g, .c.f.h, .c.f.i {
                -fx-text-fill: rgba(0, 0, 255, 1);
            }
            """
        }

        stylesheet {
            s(a, b, c) {
                +s(d, e, f) {
                    s(g, h, i) {
                        textFill = Color.BLUE
                    }
                }
            }
        } shouldEqual {
            """
            .a.d .g, .a.d .h, .a.d .i, .a.e .g, .a.e .h, .a.e .i, .a.f .g, .a.f .h, .a.f .i, .b.d .g, .b.d .h, .b.d .i, .b.e .g, .b.e .h, .b.e .i, .b.f .g, .b.f .h, .b.f .i, .c.d .g, .c.d .h, .c.d .i, .c.e .g, .c.e .h, .c.e .i, .c.f .g, .c.f .h, .c.f .i {
                -fx-text-fill: rgba(0, 0, 255, 1);
            }
            """
        }
    }

    // TODO: Test string parsing

    @Test
    fun multiValue() {
        stylesheet {
            label {
                backgroundColor = multi(Color.WHITE, Color.BLUE)
            }
        } shouldEqual {
            ".label { -fx-background-color: rgba(255, 255, 255, 1), rgba(0, 0, 255, 1); }"
        }
    }

    @Test
    fun singleValue() {
        stylesheet {
            label {
                backgroundColor += Color.WHITE
            }
        } shouldEqual {
            ".label { -fx-background-color: rgba(255, 255, 255, 1); }"
        }
    }

    @Test
    fun selectorOrder() {
        stylesheet {
            vbox child wrapper contains label {
                backgroundColor += Color.WHITE
            }
        } shouldEqual {
            ".vbox > .wrapper .label { -fx-background-color: rgba(255, 255, 255, 1); }"
        }
    }

    @Test
    fun nestedModifier_1() {
        stylesheet {
            s(label, text) {
                +s(hover, armed) {
                    backgroundColor += c("blue", 0.25)
                }
            }
        } shouldEqual {
            """
        .label:hover, .label:armed, .text:hover, .text:armed {
            -fx-background-color: rgba(0, 0, 255, 0.25);
        }
        """
        }
    }

    @Test
    fun gradientsWithErrorColor() {
        stylesheet {
            val hover = mixin {
                +hover {<commit_msg>Added multiSelect test<commit_after>package tornadofx

import javafx.scene.layout.Pane
import javafx.scene.paint.*
import javafx.scene.text.Font
import javafx.scene.text.FontWeight
import org.junit.Assert
import org.junit.Test
import tornadofx.Stylesheet.Companion.armed
import tornadofx.Stylesheet.Companion.hover
import tornadofx.Stylesheet.Companion.label
import kotlin.test.assertEquals

class StylesheetTests {
    val vbox by cssclass()
    val wrapper by cssclass()

    val text by cssclass()
    val box by cssclass()

    val a by cssclass()
    val b by cssclass()
    val c by cssclass()
    val d by cssclass()
    val e by cssclass()
    val f by cssclass()
    val g by cssclass()
    val h by cssclass()
    val i by cssclass()

    @Test
    fun cartesian() {
        stylesheet {
            s(a, b, c) {
                s(d, e, f) {
                    s(g, h, i) {
                        textFill = Color.BLUE
                    }
                }
            }
        } shouldEqual {
            """
            .a .d .g, .a .d .h, .a .d .i, .a .e .g, .a .e .h, .a .e .i, .a .f .g, .a .f .h, .a .f .i, .b .d .g, .b .d .h, .b .d .i, .b .e .g, .b .e .h, .b .e .i, .b .f .g, .b .f .h, .b .f .i, .c .d .g, .c .d .h, .c .d .i, .c .e .g, .c .e .h, .c .e .i, .c .f .g, .c .f .h, .c .f .i {
                -fx-text-fill: rgba(0, 0, 255, 1);
            }
            """
        }

        stylesheet {
            s(a, b, c) {
                +s(d, e, f) {
                    +s(g, h, i) {
                        textFill = Color.BLUE
                    }
                }
            }
        } shouldEqual {
            """
            .a.d.g, .a.d.h, .a.d.i, .a.e.g, .a.e.h, .a.e.i, .a.f.g, .a.f.h, .a.f.i, .b.d.g, .b.d.h, .b.d.i, .b.e.g, .b.e.h, .b.e.i, .b.f.g, .b.f.h, .b.f.i, .c.d.g, .c.d.h, .c.d.i, .c.e.g, .c.e.h, .c.e.i, .c.f.g, .c.f.h, .c.f.i {
                -fx-text-fill: rgba(0, 0, 255, 1);
            }
            """
        }

        stylesheet {
            s(a, b, c) {
                +s(d, e, f) {
                    s(g, h, i) {
                        textFill = Color.BLUE
                    }
                }
            }
        } shouldEqual {
            """
            .a.d .g, .a.d .h, .a.d .i, .a.e .g, .a.e .h, .a.e .i, .a.f .g, .a.f .h, .a.f .i, .b.d .g, .b.d .h, .b.d .i, .b.e .g, .b.e .h, .b.e .i, .b.f .g, .b.f .h, .b.f .i, .c.d .g, .c.d .h, .c.d .i, .c.e .g, .c.e .h, .c.e .i, .c.f .g, .c.f .h, .c.f .i {
                -fx-text-fill: rgba(0, 0, 255, 1);
            }
            """
        }
    }

    // TODO: Test string parsing

    @Test
    fun multiValue() {
        stylesheet {
            label {
                backgroundColor = multi(Color.WHITE, Color.BLUE)
            }
        } shouldEqual {
            ".label { -fx-background-color: rgba(255, 255, 255, 1), rgba(0, 0, 255, 1); }"
        }
    }

    @Test
    fun singleValue() {
        stylesheet {
            label {
                backgroundColor += Color.WHITE
            }
        } shouldEqual {
            ".label { -fx-background-color: rgba(255, 255, 255, 1); }"
        }
    }

    @Test
    fun selectorOrder() {
        stylesheet {
            vbox child wrapper contains label {
                backgroundColor += Color.WHITE
            }
        } shouldEqual {
            ".vbox > .wrapper .label { -fx-background-color: rgba(255, 255, 255, 1); }"
        }
    }

    @Test
    fun multiSelect() {
        stylesheet {
            s(vbox child wrapper contains label, label) {
                textFill = Color.BLUE
            }
        } shouldEqual {
            """
            .vbox > .wrapper .label, .label {
                -fx-text-fill: rgba(0, 0, 255, 1);
            }
            """
        }
    }

    @Test
    fun nestedModifier_1() {
        stylesheet {
            s(label, text) {
                +s(hover, armed) {
                    backgroundColor += c("blue", 0.25)
                }
            }
        } shouldEqual {
            """
        .label:hover, .label:armed, .text:hover, .text:armed {
            -fx-background-color: rgba(0, 0, 255, 0.25);
        }
        """
        }
    }

    @Test
    fun gradientsWithErrorColor() {
        stylesheet {
            val hover = mixin {
                +hover {
{'fraction_non_alphanumeric': 0.16960618506885722, 'fraction_numerical': 0.016670693404203914, 'mean_word_length': 1.0084910237748665, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 6, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4033000', 'n_tokens_mistral': 3322, 'n_tokens_neox': 3078, 'n_words': 786}