function shouldBe(actual, expected) {
    if (actual !== expected)
        throw new Error(`expected ${expected} but got ${actual}`);
}

function shouldThrow(func, errorType) {
    let error;
    try {
        func();
    } catch (e) {
        error = e;
    }

    if (!(error instanceof errorType))
        throw new Error(`Expected ${errorType.name}!`);
}

shouldBe(String.prototype.toLocaleUpperCase.length, 0);

// Check empty string optimization.
shouldBe(''.toLocaleUpperCase(), '');

// Generic
shouldBe(String.prototype.toLocaleUpperCase.call({ toString() { return 'a' } }), 'A');
shouldThrow(() => String.prototype.toLocaleUpperCase.call({ toString() { throw new Error() } }), Error);
shouldThrow(() => String.prototype.toLocaleUpperCase.call(null), TypeError);
shouldThrow(() => String.prototype.toLocaleUpperCase.call(undefined), TypeError);

// Ignores non-object, non-string locale list.
shouldBe('a'.toLocaleUpperCase(9), 'A');
// Handles array-like objects with holes.
shouldBe('i'.toLocaleUpperCase({ length: 4, 1: 'az', 3: 'en' }), '\u0130');
// Doesn't throw, but ignores private tags.
shouldBe('a'.toLocaleUpperCase('x-some-thing'), 'A');
// Throws on problems with length, get, or toString.
shouldThrow(() => 'a'.toLocaleUpperCase(Object.create(null, { length: { get() { throw new Error() } } })), Error);
shouldThrow(() => 'a'.toLocaleUpperCase(Object.create(null, { length: { value: 1 }, 0: { get() { throw new Error() } } })), Error);
shouldThrow(() => 'a'.toLocaleUpperCase([ { toString() { throw new Error() } } ]), Error);
// Throws on bad tags.
shouldThrow(() => 'a'.toLocaleUpperCase([ 5 ]), TypeError);
shouldThrow(() => 'a'.toLocaleUpperCase(''), RangeError);
shouldThrow(() => 'a'.toLocaleUpperCase('a'), RangeError);
shouldThrow(() => 'a'.toLocaleUpperCase('abcdefghij'), RangeError);
shouldThrow(() => 'a'.toLocaleUpperCase('#$'), RangeError);
shouldThrow(() => 'a'.toLocaleUpperCase('en-@-abc'), RangeError);
shouldThrow(() => 'a'.toLocaleUpperCase('en-u'), RangeError);
shouldThrow(() => 'a'.toLocaleUpperCase('en-u-kn-true-u-ko-true'), RangeError);
shouldThrow(() => 'a'.toLocaleUpperCase('en-x'), RangeError);
shouldThrow(() => 'a'.toLocaleUpperCase('en-*'), RangeError);
shouldThrow(() => 'a'.toLocaleUpperCase('en-'), RangeError);
shouldThrow(() => 'a'.toLocaleUpperCase('en--US'), RangeError);

// Check ascii and accents.
shouldBe('AbCdEfGhIjKlMnOpQRStuvWXyZ0123456789'.toLocaleUpperCase(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789');
shouldBe('àéîöœøūñ'.toLocaleUpperCase(), 'ÀÉÎÖŒØŪÑ');

// Check non-special case for i.
shouldBe('i'.toLocaleUpperCase('und'), 'I');

// Check for special casing of Azeri.
shouldBe('\u0130'.toLocaleUpperCase('az'), '\u0130');
shouldBe('I'.toLocaleUpperCase('az'), 'I');
shouldBe('i'.toLocaleUpperCase('az'), '\u0130');
shouldBe('\u0131'.toLocaleUpperCase('az'), 'I');

// Check for special casing of Lithuanian.
shouldBe('I\u0307'.toLocaleUpperCase('lt'), 'I\u0307');
shouldBe('J\u0307'.toLocaleUpperCase('lt'), 'J\u0307');
// Code points with Soft_Dotted property (Unicode 5.1, PropList.txt)
var softDotted = [
    '\u0069', '\u006A',               // LATIN SMALL LETTER I..LATIN SMALL LETTER J
    '\u012F',                         // LATIN SMALL LETTER I WITH OGONEK
    '\u0249',                         // LATIN SMALL LETTER J WITH STROKE
    '\u0268',                         // LATIN SMALL LETTER I WITH STROKE
    '\u029D',                         // LATIN SMALL LETTER J WITH CROSSED-TAIL
    '\u02B2',                         // MODIFIER LETTER SMALL J
    '\u03F3',                         // GREEK LETTER YOT
    '\u0456',                         // CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
    '\u0458',                         // CYRILLIC SMALL LETTER JE
    '\u1D62',                         // LATIN SUBSCRIPT SMALL LETTER I
    '\u1D96',                         // LATIN SMALL LETTER I WITH RETROFLEX HOOK
    '\u1DA4',                         // MODIFIER LETTER SMALL I WITH STROKE
    '\u1DA8',                         // MODIFIER LETTER SMALL J WITH CROSSED-TAIL
    '\u1E2D',                         // LATIN SMALL LETTER I WITH TILDE BELOW
    '\u1ECB',                         // LATIN SMALL LETTER I WITH DOT BELOW
    '\u2071',                         // SUPERSCRIPT LATIN SMALL LETTER I
    '\u2148', '\u2149',               // DOUBLE-STRUCK ITALIC SMALL I..DOUBLE-STRUCK ITALIC SMALL J
    '\u2C7C',                         // LATIN SUBSCRIPT SMALL LETTER J
    '\uD835\uDC22', '\uD835\uDC23',   // MATHEMATICAL BOLD SMALL I..MATHEMATICAL BOLD SMALL J
    '\uD835\uDC56', '\uD835\uDC57',   // MATHEMATICAL ITALIC SMALL I..MATHEMATICAL ITALIC SMALL J
    '\uD835\uDC8A', '\uD835\uDC8B',   // MATHEMATICAL BOLD ITALIC SMALL I..MATHEMATICAL BOLD ITALIC SMALL J
    '\uD835\uDCBE', '\uD835\uDCBF',   // MATHEMATICAL SCRIPT SMALL I..MATHEMATICAL SCRIPT SMALL J
    '\uD835\uDCF2', '\uD835\uDCF3',   // MATHEMATICAL BOLD SCRIPT SMALL I..MATHEMATICAL BOLD SCRIPT SMALL J
    '\uD835\uDD26', '\uD835\uDD27',   // MATHEMATICAL FRAKTUR SMALL I..MATHEMATICAL FRAKTUR SMALL J
    '\uD835\uDD5A', '\uD835\uDD5B',   // MATHEMATICAL DOUBLE-STRUCK SMALL I..MATHEMATICAL DOUBLE-STRUCK SMALL J
    '\uD835\uDD8E', '\uD835\uDD8F',   // MATHEMATICAL BOLD FRAKTUR SMALL I..MATHEMATICAL BOLD FRAKTUR SMALL J
    '\uD835\uDDC2', '\uD835\uDDC3',   // MATHEMATICAL SANS-SERIF SMALL I..MATHEMATICAL SANS-SERIF SMALL J
    '\uD835\uDDF6', '\uD835\uDDF7',   // MATHEMATICAL SANS-SERIF BOLD SMALL I..MATHEMATICAL SANS-SERIF BOLD SMALL J
    '\uD835\uDE2A', '\uD835\uDE2B',   // MATHEMATICAL SANS-SERIF ITALIC SMALL I..MATHEMATICAL SANS-SERIF ITALIC SMALL J
    '\uD835\uDE5E', '\uD835\uDE5F',   // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J
    '\uD835\uDE92', '\uD835\uDE93',   // MATHEMATICAL MONOSPACE SMALL I..MATHEMATICAL MONOSPACE SMALL J
];
// COMBINING DOT ABOVE (U+0307) removed when preceded by Soft_Dotted.
for (var i = 0; i < softDotted.length; ++i) {
    shouldBe(`${softDotted[i]}\u0307`.toLocaleUpperCase('lt'), softDotted[i].toLocaleUpperCase('und'));
    shouldBe(`${softDotted[i]}\u0323\u0307`.toLocaleUpperCase('lt'), `${softDotted[i].toLocaleUpperCase('und')}\u0323`);
    shouldBe(`${softDotted[i]}\uD800\uDDFD\u0307`.toLocaleUpperCase('lt'), `${softDotted[i].toLocaleUpperCase('und')}\uD800\uDDFD`);
}

// Check for special casing of Turkish.
shouldBe('\u0130'.toLocaleUpperCase('tr'), '\u0130');
shouldBe('I'.toLocaleUpperCase('tr'), 'I');
shouldBe('i'.toLocaleUpperCase('tr'), '\u0130');
shouldBe('\u0131'.toLocaleUpperCase('tr'), 'I');
