<!DOCTYPE html>
<style>
#justifyItemsBaseline {
    justify-items: baseline;
}

#justifyItemsFirstBaseline {
    justify-items: first baseline;
}

#justifyItemsLastBaseline {
    justify-items: last baseline;
}

#justifyItemsStretch {
    justify-items: stretch;
}

#justifyItemsNormal {
    justify-items: normal;
}

#justifyItemsStart {
    justify-items: start;
}

#justifyItemsEnd {
    justify-items: end;
}

#justifyItemsCenter {
    justify-items: center;
}

#justifyItemsSelfStart {
    justify-items: self-start;
}

#justifyItemsSelfEnd {
    justify-items: self-end;
}

#justifyItemsLeft {
    justify-items: left;
}

#justifyItemsRight {
    justify-items: right;
}

#justifyItemsFlexStart {
    justify-items: flex-start;
}

#justifyItemsFlexEnd {
    justify-items: flex-end;
}

#justifyItemsUnsafeEnd {
    justify-items: unsafe end ;
}

#justifyItemsUnsafeCenter {
    justify-items: unsafe center ;
}

#justifyItemsSafeSelfEnd {
    justify-items: safe self-end;
}

#justifyItemsSafeSelfStart {
    justify-items: safe self-start;
}

#justifyItemsSafeRight {
    justify-items: safe right;
}

#justifyItemsUnsafeLeft {
    justify-items: unsafe left;
}

#justifyItemsUnsafeFlexStart {
    justify-items: unsafe flex-start;
}

#justifyItemsSafeFlexEnd {
    justify-items: safe flex-end;
}

#justifyItemsLegacyLeft {
    justify-items: legacy left;
}

#justifyItemsLegacyCenter {
    justify-items: legacy center;
}

#justifyItemsLegacyRight {
    justify-items: legacy right;
}

#justifyItemsLeftLegacy {
    justify-items: left legacy;
}

#justifyItemsCenterLegacy {
    justify-items: center legacy;
}

#justifyItemsRightLegacy {
    justify-items: right legacy;
}
</style>
<p>Test that setting and getting justify-items works as expected</p>
<div id="justifyItemsBaseline"></div>
<div id="justifyItemsFirstBaseline"></div>
<div id="justifyItemsLastBaseline"></div>
<div id="justifyItemsStretch"></div>
<div id="justifyItemsNormal"></div>
<div id="justifyItemsStart"></div>
<div id="justifyItemsEnd"></div>
<div id="justifyItemsCenter"></div>
<div id="justifyItemsSelfStart"></div>
<div id="justifyItemsSelfEnd"></div>
<div id="justifyItemsLeft"></div>
<div id="justifyItemsRight"></div>
<div id="justifyItemsFlexStart"></div>
<div id="justifyItemsFlexEnd"></div>

<div id="justifyItemsUnsafeEnd"></div>
<div id="justifyItemsUnsafeCenter"></div>
<div id="justifyItemsSafeSelfEnd"></div>
<div id="justifyItemsSafeSelfStart"></div>
<div id="justifyItemsSafeRight"></div>
<div id="justifyItemsUnsafeLeft"></div>
<div id="justifyItemsUnsafeFlexStart"></div>
<div id="justifyItemsSafeFlexEnd"></div>
<div id="justifyItemsLegacyLeft"></div>
<div id="justifyItemsLegacyCenter"></div>
<div id="justifyItemsLegacyRight"></div>
<div id="justifyItemsLeftLegacy"></div>
<div id="justifyItemsCenterLegacy"></div>
<div id="justifyItemsRightLegacy"></div>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="resources/alignment-parsing-utils-th.js"></script>
<script>
test(function() {
    var justifyItemsBaseline = document.getElementById("justifyItemsBaseline");
    checkValues(justifyItemsBaseline, "justifyItems", "justify-items", "", "baseline");
    var justifyItemsFirstBaseline = document.getElementById("justifyItemsFirstBaseline");
    checkValues(justifyItemsFirstBaseline, "justifyItems", "justify-items", "", "baseline");
    var justifyItemsLastBaseline = document.getElementById("justifyItemsLastBaseline");
    checkValues(justifyItemsLastBaseline, "justifyItems", "justify-items", "", "last baseline");
    var justifyItemsStretch = document.getElementById("justifyItemsStretch");
    checkValues(justifyItemsStretch, "justifyItems", "justify-items", "", "stretch");
    var justifyItemsNormal = document.getElementById("justifyItemsNormal");
    checkValues(justifyItemsNormal, "justifyItems", "justify-items", "", "normal");
    var justifyItemsStart = document.getElementById("justifyItemsStart");
    checkValues(justifyItemsStart, "justifyItems", "justify-items", "", "start");
    var justifyItemsEnd = document.getElementById("justifyItemsEnd");
    checkValues(justifyItemsEnd, "justifyItems", "justify-items", "", "end");
    var justifyItemsCenter = document.getElementById("justifyItemsCenter");
    checkValues(justifyItemsCenter, "justifyItems", "justify-items", "", "center");
    var justifyItemsSelfEnd = document.getElementById("justifyItemsSelfEnd");
    checkValues(justifyItemsSelfEnd, "justifyItems", "justify-items", "", "self-end");
    var justifyItemsSelfStart = document.getElementById("justifyItemsSelfStart");
    checkValues(justifyItemsSelfStart, "justifyItems", "justify-items", "", "self-start");
    var justifyItemsLeft = document.getElementById("justifyItemsLeft");
    checkValues(justifyItemsLeft, "justifyItems", "justify-items", "", "left");
    var justifyItemsRight = document.getElementById("justifyItemsRight");
    checkValues(justifyItemsRight, "justifyItems", "justify-items", "", "right");
    var justifyItemsFlexStart = document.getElementById("justifyItemsFlexStart");
    checkValues(justifyItemsFlexStart, "justifyItems", "justify-items", "", "flex-start");
    var justifyItemsFlexEnd = document.getElementById("justifyItemsFlexEnd");
    checkValues(justifyItemsFlexEnd, "justifyItems", "justify-items", "", "flex-end");

    var justifyItemsUnsafeEnd = document.getElementById("justifyItemsUnsafeEnd");
    checkValues(justifyItemsUnsafeEnd, "justifyItems", "justify-items", "", "unsafe end");
    var justifyItemsUnsafeCenter = document.getElementById("justifyItemsUnsafeCenter");
    checkValues(justifyItemsUnsafeCenter, "justifyItems", "justify-items", "", "unsafe center");
    var justifyItemsSafeSelfEnd = document.getElementById("justifyItemsSafeSelfEnd");
    checkValues(justifyItemsSafeSelfEnd, "justifyItems", "justify-items", "", "safe self-end");
    var justifyItemsSafeSelfStart = document.getElementById("justifyItemsSafeSelfStart");
    checkValues(justifyItemsSafeSelfStart, "justifyItems", "justify-items", "", "safe self-start");
    var justifyItemsSafeRight = document.getElementById("justifyItemsSafeRight");
    checkValues(justifyItemsSafeRight, "justifyItems", "justify-items", "", "safe right");
    var justifyItemsUnsafeLeft = document.getElementById("justifyItemsUnsafeLeft");
    checkValues(justifyItemsUnsafeLeft, "justifyItems", "justify-items", "", "unsafe left");
    var justifyItemsUnsafeFlexStart = document.getElementById("justifyItemsUnsafeFlexStart");
    checkValues(justifyItemsUnsafeFlexStart, "justifyItems", "justify-items", "", "unsafe flex-start");
    var justifyItemsSafeFlexEnd = document.getElementById("justifyItemsSafeFlexEnd");
    checkValues(justifyItemsSafeFlexEnd, "justifyItems", "justify-items", "", "safe flex-end");
    var justifyItemsLegacyLeft = document.getElementById("justifyItemsLegacyLeft");
    checkValues(justifyItemsLegacyLeft, "justifyItems", "justify-items", "", "legacy left");
    var justifyItemsLegacyCenter = document.getElementById("justifyItemsLegacyCenter");
    checkValues(justifyItemsLegacyCenter, "justifyItems", "justify-items", "", "legacy center");
    var justifyItemsLegacyRight = document.getElementById("justifyItemsLegacyRight");
    checkValues(justifyItemsLegacyRight, "justifyItems", "justify-items", "", "legacy right");
    var justifyItemsLeftLegacy = document.getElementById("justifyItemsLeftLegacy");
    checkValues(justifyItemsLeftLegacy, "justifyItems", "justify-items", "", "legacy left");
    var justifyItemsCenterLegacy = document.getElementById("justifyItemsCenterLegacy");
    checkValues(justifyItemsCenterLegacy, "justifyItems", "justify-items", "", "legacy center");
    var justifyItemsRightLegacy = document.getElementById("justifyItemsRightLegacy");
    checkValues(justifyItemsRightLegacy, "justifyItems", "justify-items", "", "legacy right");
}, "Test getting justify-items set through CSS.");

test(function() {
    element = document.createElement("div");
    document.body.appendChild(element);
    checkValues(element, "justifyItems", "justify-items", "", "normal");
}, "Test initial value of justify-items through JS");

test(function() {
    element = document.createElement("div");
    document.body.appendChild(element);
    element.style.justifyItems = "center";
    checkValues(element, "justifyItems", "justify-items",  "center", "center");

    element.style.justifyItems = "unsafe start";
    checkValues(element, "justifyItems", "justify-items",  "unsafe start", "unsafe start");

    element.style.justifyItems = "safe flex-end";
    checkValues(element, "justifyItems", "justify-items",  "safe flex-end", "safe flex-end");

    element.style.justifyItems = "right legacy";
    checkValues(element, "justifyItems", "justify-items",  "legacy right", "legacy right");

    element.style.justifyItems = "center legacy";
    checkValues(element, "justifyItems", "justify-items",  "legacy center", "legacy center");

    element.style.justifyItems = "left legacy";
    checkValues(element, "justifyItems", "justify-items",  "legacy left", "legacy left");

    element.style.justifyItems = "right";
    checkValues(element, "justifyItems", "justify-items",  "right", "right");

    element.style.justifyItems = "center";
    checkValues(element, "justifyItems", "justify-items",  "center", "center");

    element.style.justifyItems = "self-start";
    checkValues(element, "justifyItems", "justify-items",  "self-start", "self-start");

    element.style.justifyItems = "normal";
    checkValues(element, "justifyItems", "justify-items",  "normal", "normal");

    element.style.justifyItems = "legacy";
    checkValues(element, "justifyItems", "justify-items",  "legacy", "normal");

    element.style.display = "flex";
    element.style.justifyItems = "legacy";
    checkValues(element, "justifyItems", "justify-items",  "legacy", "normal");

    element.style.display = "grid";
    element.style.justifyItems = "legacy";
    checkValues(element, "justifyItems", "justify-items",  "legacy", "normal");

    element.style.justifyItems = "self-end";
    checkValues(element, "justifyItems", "justify-items",  "self-end", "self-end");
}, "Test getting and setting justify-items through JS");

test(function() {
    document.documentElement.style.justifyItems = "legacy";
    checkValues(document.documentElement, "justifyItems", "justify-items",  "legacy", "normal");
}, "Test 'legacy' value resolution for the root node");

test(function() {
    element = document.createElement("div");
    document.body.appendChild(element);

    checkBadValues(element, "justifyItems", "justify-items",  "auto");
    checkBadValues(element, "justifyItems", "justify-items",  "unsafe auto");
    checkBadValues(element, "justifyItems", "justify-items",  "auto safe");
    checkBadValues(element, "justifyItems", "justify-items",  "auto left");
    checkBadValues(element, "justifyItems", "justify-items",  "normal unsafe");
    checkBadValues(element, "justifyItems", "justify-items",  "normal stretch");
    checkBadValues(element, "justifyItems", "justify-items",  "baseline normal");
    checkBadValues(element, "justifyItems", "justify-items",  "baseline safe");
    checkBadValues(element, "justifyItems", "justify-items",  "baseline center");
    checkBadValues(element, "justifyItems", "justify-items",  "first baseline center");
    checkBadValues(element, "justifyItems", "justify-items",  "last baseline center");
    checkBadValues(element, "justifyItems", "justify-items",  "baseline last");
    checkBadValues(element, "justifyItems", "justify-items",  "baseline first");
    checkBadValues(element, "justifyItems", "justify-items",  "stretch unsafe");
    checkBadValues(element, "justifyItems", "justify-items",  "stretch right");
    checkBadValues(element, "justifyItems", "justify-items",  "unsafe unsafe");
    checkBadValues(element, "justifyItems", "justify-items",  "unsafe safe");
    checkBadValues(element, "justifyItems", "justify-items",  "center start");
    checkBadValues(element, "justifyItems", "justify-items",  "stretch unsafe");
    checkBadValues(element, "justifyItems", "justify-items",  "safe stretch");
    checkBadValues(element, "justifyItems", "justify-items",  "baseline safe");
    checkBadValues(element, "justifyItems", "justify-items",  "unsafe baseline");
    checkBadValues(element, "justifyItems", "justify-items",  "unsafe safe left");
    checkBadValues(element, "justifyItems", "justify-items",  "unsafe left safe");
    checkBadValues(element, "justifyItems", "justify-items",  "left safe unsafe safe");
    checkBadValues(element, "justifyItems", "justify-items",  "legacy start");
    checkBadValues(element, "justifyItems", "justify-items",  "legacy end");
    checkBadValues(element, "justifyItems", "justify-items",  "legacy right unsafe");
    checkBadValues(element, "justifyItems", "justify-items",  "legacy auto");
    checkBadValues(element, "justifyItems", "justify-items",  "legacy stretch");
    checkBadValues(element, "justifyItems", "justify-items",  "safe legacy");
    checkBadValues(element, "justifyItems", "justify-items",  "legacy left right");
    checkBadValues(element, "justifyItems", "justify-items",  "start safe");
    checkBadValues(element, "justifyItems", "justify-items",  "end unsafe");
}, "Test bad combinations of justify-items");

test(function() {
    element.style.display = "";
    checkInitialValues(element, "justifyItems", "justify-items", "legacy center", "normal");
}, "Test the value 'initial'");

test(function() {
    element.style.display = "grid";
    checkInitialValues(element, "justifyItems", "justify-items", "safe left", "normal");
}, "Test the value 'initial' for grid containers");

test(function() {
    element.style.display = "flex";
    checkInitialValues(element, "justifyItems", "justify-items", "unsafe right", "normal");
}, "Test the value 'initial' for flex containers");

test(function() {
    checkInheritValues("justifyItems", "justify-items", "end");
    checkInheritValues("justifyItems", "justify-items", "safe left");
    checkInheritValues("justifyItems", "justify-items", "unsafe center");
}, "Test the value 'inherit'");

test(function() {
    checkLegacyValues("justifyItems", "justify-items", "legacy left");
    checkLegacyValues("justifyItems", "justify-items", "legacy center");
    checkLegacyValues("justifyItems", "justify-items", "legacy right");
}, "Test the legacy alignment");
</script>
