<!DOCTYPE html>
<html>
<head>
<title>The custom element type is a sequence of characters that must match the NCName production and contain a minus character</title>
<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru">
<meta name="assert" content="The custom element type is a sequence of characters that must match the NCName production and contain a U+002D HYPHEN-MINUS character">
<link rel="help" href="https://dvcs.w3.org/hg/webcomponents/raw-file/default/spec/custom/index.html#concepts">
<link rel="help" href="http://www.w3.org/TR/1999/REC-xml-names-19990114/#NT-NCName">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../testcommon.js"></script>
<link rel="stylesheet" href="/resources/testharness.css">
</head>
<body>
<div id="log"></div>
<script>
test(function() {
    var doc = newHTMLDocument();
    var validNames = ['x-frame', 'xx-frame', 'x--frame', '_-frame', 'x-', 'x--',
                      'x-1', 'x-_', '_-_', '__-',  '_-1',  '_-..'];
    HTML5_ELEMENTS.forEach(function(value) {
        validNames.push('x-' + value);
        validNames.push('Y-' + value.toUpperCase());
    });
    validNames.forEach(function(value) {
        try {
            doc.registerElement(value);
        } catch (e) {
            assert_unreached('Exception should not be thrown in case of attempt ' +
                'to register a custom element with a name \'' + value + '\'');
        }
    });
}, 'Registering valid custom element types');

test(function() {
    var doc = newHTMLDocument();
    var invalidNames = ['xframe', 'x_frame', 'x.frame', 'x1frame', '-xframe', '1-frame',
                        '1x-frame',	'.-frame', '_frame', 'x-f!rame', 'x-:frame'];
    invalidNames.forEach(function(value) {
        assert_throws('SyntaxError', function() {
            doc.registerElement(value);
        }, 'Exception should be thrown in case of attempt to register element ' +
            'with the name \'' + value + '\'');
    });
}, 'Registering invalid custom element types should fail');

test(function() {
    var doc = newHTMLDocument();
    var forbiddenNames = ['annotation-xml',
                        'color-profile',
                        'font-face',
                        'font-face-src',
                        'font-face-uri',
                        'font-face-format',
                        'font-face-name',
                        'missing-glyph'];
    forbiddenNames.forEach(function(value) {
        assert_throws('SyntaxError', function() {
            doc.registerElement(value);
        }, 'Exception should be thrown in case of attempt to register element ' +
            'with the name \'' + value + '\'');
    });
}, 'Registering forbidden custom element types should fail');
</script>
</body>
</html>
