blob: 5ade7d0d282a346de6b1f054457f431374843778 [file] [log] [blame]
<!DOCTYPE HTML>
<html>
<head>
<title>IdlDictionary.prototype.default_to_json_operation()</title>
</head>
<body>
<div id="log"></div>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/WebIDLParser.js"></script>
<script src="/resources/idlharness.js"></script>
<script src="../../../idl-helper.js"></script>
<script>
"use strict";
test(function() {
var map = interfaceFrom('interface A { [Default] object toJSON(); };').default_to_json_operation();
assert_equals(map.size, 0);
}, 'should return an empty map when there are no attributes');
test(function() {
var r = interfaceFrom('interface A { };').default_to_json_operation();
assert_equals(r, null);
}, 'should return null when there is no toJSON method');
test(function() {
var r = interfaceFrom('interface A { DOMString toJSON(); };').default_to_json_operation();
assert_equals(r, null);
}, 'should return null when there is a toJSON method but it does not have the [Default] extended attribute');
test(function() {
var context = new IdlArray();
context.add_idls("interface A : B { DOMString toJSON(); };");
context.add_idls("interface B { [Default] object toJSON(); };");
var r = context.members.A.default_to_json_operation();
assert_equals(r, null);
}, 'should return null when there is a toJSON method but it does not have the [Default] extended attribute even if this extended attribute exists on inherited interfaces');
test(function() {
var map = interfaceFrom('interface A { [Default] object toJSON(); static attribute DOMString foo; };').default_to_json_operation();
assert_equals(map.size, 0);
}, 'should not include static attributes');
test(function() {
var map = interfaceFrom('interface A { [Default] object toJSON(); attribute Promise<DOMString> bar; };').default_to_json_operation();
assert_equals(map.size, 0);
}, 'should not include attributes which are not JSON types');
test(function() {
var map = interfaceFrom('interface A { [Default] object toJSON(); DOMString bar(); };').default_to_json_operation();
assert_equals(map.size, 0);
}, 'should not include operations');
test(function() {
var map = interfaceFrom('interface A { [Default] object toJSON(); attribute DOMString bar; };').default_to_json_operation();
assert_equals(map.size, 1);
assert_true(map.has("bar"));
assert_equals(map.get("bar").idlType, "DOMString");
}, 'should return a map whose key/value pair represent the identifier and IDL type of valid attributes');
test(function() {
var context = new IdlArray();
context.add_idls("interface A : B { [Default] object toJSON(); attribute DOMString a; };");
context.add_idls("interface B { [Default] object toJSON(); attribute long b; };");
var map = context.members.A.default_to_json_operation();
assert_array_equals([...map.keys()], ["b", "a"]);
assert_array_equals([...map.values()].map(v => v.idlType), ["long", "DOMString"]);
}, 'should return a properly ordered map that contains IDL types of valid attributes for inherited interfaces');
test(function() {
var context = new IdlArray();
context.add_idls("interface A : B { attribute DOMString a; };");
context.add_idls("interface B { [Default] object toJSON(); attribute long b; };");
var map = context.members.A.default_to_json_operation();
assert_equals(map.size, 1);
assert_true(map.has("b"));
assert_equals(map.get("b").idlType, "long");
assert_array_equals([...map.keys()], ["b"]);
}, 'should not include attributes of the current interface when the [Default] toJSON method in inherited');
test(function() {
var context = new IdlArray();
context.add_idls("interface A : B { [Default] object toJSON(); };");
context.add_idls("interface B : C { [Default] object toJSON(); attribute DOMString foo; };");
context.add_idls("interface C { [Default] object toJSON(); attribute long foo; };");
var map = context.members.A.default_to_json_operation();
assert_equals(map.size, 1);
assert_true(map.has("foo"));
assert_equals(map.get("foo").idlType, "DOMString");
}, 'attributes declared further away in the inheritance hierarchy should be masked by attributes declared closer');
test(function() {
var context = new IdlArray();
context.add_idls("interface A { [Default] object toJSON(); attribute DOMString a; };");
context.add_idls("interface B : A { attribute any b; };");
context.add_idls("interface C : B { [Default] object toJSON(); attribute long c; };");
var map = context.members.C.default_to_json_operation();
assert_array_equals([...map.keys()], ["a", "c"]);
assert_array_equals([...map.values()].map(v => v.idlType), ["DOMString", "long"]);
}, 'should return an ordered map that ignores attributes of inherited interfaces which do not declare a [Default] toJSON operation.');
test(function() {
var context = new IdlArray();
context.add_idls("interface D { attribute DOMString d; };");
context.add_idls("interface mixin M { [Default] object toJSON(); attribute long m; };");
context.add_idls("D includes M;");
context.merge_mixins();
var map = context.members.D.default_to_json_operation();
assert_array_equals([...map.keys()], ["d", "m"]);
assert_array_equals([...map.values()].map(v => v.idlType), ["DOMString", "long"]);
}, 'should return a properly ordered map that accounts for mixed-in interfaces which declare a [Default] toJSON operation.');
</script>
</body>
</html>