"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
Object.defineProperty(exports, "__esModule", { value: true });
var utils_1 = require("../utils");
var chai_1 = require("chai");
describe(__filename + "#", function () {
    [
        // various
        [".a { color: red; }", "[class]._80f4925f_a { color:red; }", false],
        [
            ".a, .b { color: red; }",
            "[class]._80f4925f_a { color:red; } [class]._80f4925f_b { color:red; }",
            false
        ],
        [
            ".a.b { color: red; }",
            "[class].a[class].b[data-pc-80f4925f] { color:red; }",
            false
        ],
        [
            ".a .b { color: red; }",
            "[class]._80f4925f_a [class]._80f4925f_b { color:red; }",
            false
        ],
        [":global(.a) { color: red; }", "[class].a { color:red; }", false],
        [
            ":global(.a, .b) .c { color: red; }",
            "[class].a [class]._80f4925f_c { color:red; } [class].b [class]._80f4925f_c { color:red; }",
            false
        ],
        [
            ".c :global(.a, .b) { color: red; }",
            "[class]._80f4925f_c [class].a { color:red; } [class]._80f4925f_c [class].b { color:red; }",
            false
        ],
        [
            "a { b, c { d { color: red; }} }",
            "a[data-pc-80f4925f] b[data-pc-80f4925f] d[data-pc-80f4925f] { color:red; } a[data-pc-80f4925f] c[data-pc-80f4925f] d[data-pc-80f4925f] { color:red; }",
            false
        ],
        [
            ".c :global(.a, :global(.a1, .a2), .b) { color: red; }",
            "[class]._80f4925f_c [class].a { color:red; } [class]._80f4925f_c [class].a1 { color:red; } [class]._80f4925f_c [class].a2 { color:red; } [class]._80f4925f_c [class].b { color:red; }",
            false
        ],
        [
            ".c:within(.b) { color: red; }",
            "[class]._80f4925f_b [class].c[data-pc-80f4925f] { color:red; }",
            false
        ],
        [
            ".c:within(.b, .d) { color: red; }",
            "[class]._80f4925f_b [class].c[data-pc-80f4925f] { color:red; } [class]._80f4925f_d [class].c[data-pc-80f4925f] { color:red; }",
            false
        ],
        [
            ".c:within(.b, .d) { color: red; }",
            "[class]._80f4925f_b [data-pc-406d2856] [class].c[data-pc-80f4925f] { color:red; } [class]._80f4925f_d [data-pc-406d2856] [class].c[data-pc-80f4925f] { color:red; }",
            true
        ],
        [
            ".c { color: red; }",
            "[data-pc-406d2856] [class]._80f4925f_c { color:red; }",
            true
        ],
        [
            ":within(.a) { color: red}",
            "[class]._80f4925f_a [data-pc-406d2856][data-pc-406d2856] { color:red; }",
            true
        ],
        [
            ":self:within(.a) { color: red}",
            "[class]._80f4925f_a [data-pc-406d2856][data-pc-406d2856][data-pc-80f4925f] { color:red; }",
            true
        ],
        [
            ":within(.a):self { color: red}",
            "[class]._80f4925f_a [data-pc-406d2856][data-pc-406d2856][data-pc-80f4925f] { color:red; }",
            true
        ],
        [
            ":within(:global(.a, .b)):self { color: red}",
            "[class].a [data-pc-406d2856][data-pc-406d2856][data-pc-80f4925f] { color:red; } [class].b [data-pc-406d2856][data-pc-406d2856][data-pc-80f4925f] { color:red; }",
            true
        ],
        [
            ".a, :within(.b) { color: red}",
            "[data-pc-406d2856] [class]._80f4925f_a { color:red; } [class]._80f4925f_b [data-pc-406d2856][data-pc-406d2856] { color:red; }",
            true
        ],
        [
            ".a { .b { color: blue; }}",
            "[class]._80f4925f_a [class]._80f4925f_b { color:blue; }",
            false
        ],
        [
            ".a { &--b { color: blue; }}",
            "[class]._80f4925f_a--b { color:blue; }",
            false
        ],
        [
            ".a { &.b { color: blue; }}",
            "[class]._80f4925f_a[class].b { color:blue; }",
            false
        ],
        [
            ".a { && { &&& { color: blue; } }}",
            "[class]._80f4925f_a[class]._80f4925f_a[class]._80f4925f_a[class]._80f4925f_a[class]._80f4925f_a[class]._80f4925f_a { color:blue; }",
            false
        ],
        [
            ".a { & & { &.test { color: blue; } }}",
            "[class]._80f4925f_a [class]._80f4925f_a[class].test { color:blue; }",
            false
        ],
        [
            ":within(.a) { && { color: blue; }}",
            "[class]._80f4925f_a [data-pc-406d2856][data-pc-406d2856][data-pc-406d2856][data-pc-406d2856] { color:blue; }",
            true
        ],
        [
            "element.a { color: red; }",
            "element[class].a[data-pc-80f4925f] { color:red; }",
            false
        ],
        [
            ":global(element.b) { color: red; }",
            "element[class].b { color:red; }",
            false
        ],
        [
            "a ~ b { color: red; }",
            "a[data-pc-80f4925f] ~ b[data-pc-80f4925f] { color:red; }",
            false
        ],
        [
            "a > b { color: red; }",
            "a[data-pc-80f4925f] > b[data-pc-80f4925f] { color:red; }",
            false
        ],
        ["* { color: red; }", "[data-pc-80f4925f] { color:red; }", false],
        [":global(*) { color: red; }", "* { color:red; }", false],
        [
            ":not(a) { color: red; }",
            "[data-pc-80f4925f]:not(a) { color:red; }",
            false
        ],
        [
            "a:not(a) { color: red; }",
            "a:not(a)[data-pc-80f4925f] { color:red; }",
            false
        ],
        [
            ":not(:within(.a)) { color: red; }",
            ":not([class]._80f4925f_a) [data-pc-80f4925f] { color:red; }",
            false
        ],
        [
            ":not(:within(.a, .b)) { color: red; }",
            ":not([class]._80f4925f_a) [data-pc-80f4925f] { color:red; } :not([class]._80f4925f_b) [data-pc-80f4925f] { color:red; }",
            false
        ],
        [
            ":not(:within(:global(.a, .b))) { color: red; }",
            ":not([class].a) [data-pc-80f4925f] { color:red; } :not([class].b) [data-pc-80f4925f] { color:red; }",
            false
        ],
        [
            ":within(:not(.a)) { color: red; }",
            "[data-pc-80f4925f]:not([class].a) [data-pc-80f4925f] { color:red; }",
            false
        ],
        [
            "[data-test] { color: red; }",
            "[data-test][data-pc-80f4925f] { color:red; }",
            false
        ],
        [
            "[data-test=b] { color: red; }",
            "[data-test=b][data-pc-80f4925f] { color:red; }",
            false
        ],
        [
            "[data-test^=b] { color: red; }",
            "[data-test^=b][data-pc-80f4925f] { color:red; }",
            false
        ],
        [
            "[data-test~=b] { color: red; }",
            "[data-test~=b][data-pc-80f4925f] { color:red; }",
            false
        ],
        [
            "a:nth-child(1) { color: red; }",
            "a:nth-child(1)[data-pc-80f4925f] { color:red; }",
            false
        ],
        ["#id { color: red; }", "#id[data-pc-80f4925f] { color:red; }", false],
        [":global(#id) { color: red; }", "#id { color:red; }", false],
        // needs to emit 4 selectors
        [
            ":within(a, b):within(c, d) { color: orange; }",
            "a[data-pc-80f4925f] [data-pc-406d2856][data-pc-406d2856][data-pc-80f4925f] { color:orange; } b[data-pc-80f4925f] [data-pc-406d2856][data-pc-406d2856][data-pc-80f4925f] { color:orange; } c[data-pc-80f4925f] [data-pc-406d2856][data-pc-406d2856][data-pc-80f4925f] { color:orange; } d[data-pc-80f4925f] [data-pc-406d2856][data-pc-406d2856][data-pc-80f4925f] { color:orange; }",
            true
        ],
        [
            "a.b.c:within(:global(d, e)) { color: orange; }",
            "d [data-pc-406d2856] a[class].b[class].c[data-pc-80f4925f] { color:orange; } e [data-pc-406d2856] a[class].b[class].c[data-pc-80f4925f] { color:orange; }",
            true
        ],
        [
            "&.a { color: red}",
            "[data-pc-406d2856][data-pc-406d2856][class].a { color:red; }",
            true
        ],
        [
            ":global(a, :within(b, c, d)) { color: orange; }",
            "[data-pc-406d2856] a { color:orange; } b[data-pc-80f4925f] [data-pc-406d2856][data-pc-406d2856] { color:orange; } c[data-pc-80f4925f] [data-pc-406d2856][data-pc-406d2856] { color:orange; } d[data-pc-80f4925f] [data-pc-406d2856][data-pc-406d2856] { color:orange; }",
            true
        ],
        // https://github.com/crcn/paperclip/issues/547
        [
            ":self(.a) { &&& { color: red; &:checked { color: blue; }}}",
            "[data-pc-406d2856][data-pc-406d2856][class].a[data-pc-406d2856][data-pc-406d2856][class].a[data-pc-406d2856][data-pc-406d2856][class].a { color:red; } [data-pc-406d2856][data-pc-406d2856][class].a[data-pc-406d2856][data-pc-406d2856][class].a[data-pc-406d2856][data-pc-406d2856][class].a:checked { color:blue; }",
            true
        ],
        // https://github.com/crcn/paperclip/issues/549
        [
            ":self:empty { color: red; }",
            "[data-pc-406d2856][data-pc-406d2856]:empty[data-pc-80f4925f] { color:red; }",
            true
        ],
        // https://github.com/crcn/paperclip/issues/548
        [
            ":self > * { color: red; }",
            "[data-pc-406d2856][data-pc-406d2856] > [data-pc-80f4925f] { color:red; }",
            true
        ],
        [":root { color: red; }", "[data-pc-80f4925f] { color:red; }", false],
        [":global(:root) { color: red; }", ":root { color:red; }", false],
        // https://github.com/crcn/paperclip/issues/573
        [
            ":self(.variant) { @media screen and (max-width: 400px) { color: red; }}",
            "@media screen and (max-width: 400px) { [data-pc-406d2856][data-pc-406d2856][class].variant { color:red; } }",
            true
        ]
        // group, selector
    ].forEach(function (_a) {
        var input = _a[0], output = _a[1], scoped = _a[2];
        it("compiles " + input + " -> " + output, function () { return __awaiter(void 0, void 0, void 0, function () {
            var source, engine, text, _a;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        source = "<style>" + input + "</style>";
                        if (scoped) {
                            source = "<div>" + source + "</div>";
                        }
                        return [4 /*yield*/, utils_1.createMockEngine({
                                "/entry.pc": source
                            })];
                    case 1:
                        engine = _b.sent();
                        _a = utils_1.stringifyLoadResult;
                        return [4 /*yield*/, engine.run("/entry.pc")];
                    case 2:
                        text = _a.apply(void 0, [_b.sent()]).match(/<style>(.*?)<\/style>/)[1];
                        chai_1.expect(text).to.eql(output);
                        return [2 /*return*/];
                }
            });
        }); });
    });
});
