<!DOCTYPE html>
<html>
<head>
<style>
.editing {
    border: 2px solid red;
    padding: 12px;
    font-size: 24px;
}
</style>
<script src="../editing.js" language="JavaScript" type="text/JavaScript" ></script>
</head>
<body>
<script src="../../resources/js-test-pre.js"></script>

<div id="container"></div>

<script>
description("Tests spelling and grammar markers for misspellings.");

jsTestIsAsync = true;

if (window.internals) {
    internals.settings.setUnifiedTextCheckerEnabled(true);
    internals.settings.setAsynchronousSpellCheckingEnabled(true);
}

function createEditableElement(parent, textContent) {
    var e = document.createElement('div');
    e.setAttribute("contentEditable", "true");
    e.textContent = textContent;
    e.className = 'editing';

    parent.appendChild(e);
    return e;
}

function typeText(elem, text) {
    elem.focus();
    selectAllCommand();
    deleteCommand();
    for (var i = 0; i < text.length; ++i)
        typeCharacterCommand(text[i]);
}

const container = document.getElementById('container');
const elementWithGrammarIssue = createEditableElement(container, "I have a issue.");
const elementWithSpellingIssue  = createEditableElement(container, "zz.");
const elementWithGrammarAndSpellingIssue = createEditableElement(container, "orange,zz,apple.");

const misspellings = [
    { marker: 'spelling',  issue: 'a' },
    { marker: 'grammar',  issue: 'a' },
    { marker: 'grammar',  issue: 'I have a issue.' },
    { marker: 'spelling', issue: 'zz' },
    { marker: 'grammar',  issue: 'orange,zz,apple.' },
    { marker: 'spelling',  issue: 'orange,zz,apple' },
];

const results = [
    { "type": "spelling", "from": 7, "to": 8 },
    {
        "type": "grammar",
        "from": 7,
        "to": 8,
        "details": [{ "from": 0, "to": 1 }]
    },
    {
        "type": "grammar",
        "from": 0,
        "to": 15,
        "details": [{ "from": 7, "to": 8 }]
    }
];

var tests = [
    function() { verifyDesiredMarkers(elementWithGrammarIssue, misspellings.slice(0, 1), results.slice(0, 1)) },
    function() { verifyDesiredMarkers(elementWithGrammarIssue, misspellings.slice(1, 2), results.slice(1, 2)) },
    function() { verifyDesiredMarkers(elementWithGrammarIssue, misspellings.slice(0, 2), results.slice(0, 2)) },
    function() { verifyDesiredMarkers(elementWithSpellingIssue, misspellings.slice(3, 4)) },
    function() { verifyDesiredMarkers(elementWithGrammarAndSpellingIssue, misspellings.slice(4, 6)) },

    // Those expect to have only one kind of markers either spelling or grammar.
    function() { verifyUnexpectedMarkers(elementWithGrammarIssue, misspellings.slice(0, 1), results.slice(0, 1)) },
    function() { verifyUnexpectedMarkers(elementWithGrammarIssue, misspellings.slice(1, 2), results.slice(1, 2)) },
    function() { verifyUnexpectedMarkers(elementWithSpellingIssue, misspellings.slice(3, 4)) },
];

var element;
var nextMisspellingData;

function verifyDesiredMarkers(e, misspellings, overrideSpellCheckingResults)
{
    if (!window.internals)
        return done();

    const textToCheck = e.firstChild.nodeValue;
    const spellCheckerResults = { };
    if (overrideSpellCheckingResults)
        spellCheckerResults[textToCheck] = overrideSpellCheckingResults;
    testRunner.setSpellCheckerResults(spellCheckerResults);

    typeText(e, textToCheck);

    element = e;
    nextMisspellingData = misspellings.shift();
    if (!nextMisspellingData)
        return done();

    debug(`Checking for issue on '${textToCheck}'`);

    shouldBecomeDifferent('internals.markerRangeForNode(element.firstChild, nextMisspellingData.marker, 0)', "null", function() {
        range = internals.markerRangeForNode(element.firstChild, nextMisspellingData.marker, 0);
        shouldBeEqualToString('range.toString()', nextMisspellingData.issue);
        debug("");
        verifyDesiredMarkers(element, misspellings);
    });
}

var oppositeMarker;
function verifyUnexpectedMarkers(e, misspellings, overrideSpellCheckingResults)
{
    const textToCheck = e.firstChild.nodeValue;
    const spellCheckerResults = { };
    if (overrideSpellCheckingResults)
        spellCheckerResults[textToCheck] = overrideSpellCheckingResults;
    testRunner.setSpellCheckerResults(spellCheckerResults);

    typeText(e, textToCheck);

    element = e;
    nextMisspellingData = misspellings.shift();

    if (nextMisspellingData.marker == 'grammar')
        oppositeMarker = 'spelling';
    else if (nextMisspellingData.marker == 'spelling')
        oppositeMarker = 'grammar';

    debug(`Checking for no other issues on '${textToCheck}'`);

    shouldBecomeEqual('internals.markerCountForNode(element.firstChild, oppositeMarker)', '0', function() {
        debug("");
        done();
    });
}

function done()
{
    var next = tests.shift();
    if (next)
        return window.setTimeout(next, 0);

    finishJSTest();
}
done();
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
