| function checkContainer(actual, expected) { |
| if (!actual) return true; |
| if (!expected) return false; |
| return actual.id == expected.id && actual.src == expected.src; |
| } |
| |
| function checkAttribution(attribution, expected) { |
| assert_own_property(attribution, 'url'); |
| assert_own_property(attribution, 'scope'); |
| let found = false; |
| for (const e of expected) { |
| if (attribution.url === e.url && |
| attribution.scope === e.scope && |
| checkContainer(attribution.container, e.container)) { |
| found = true; |
| e.found = true; |
| } |
| } |
| assert_true(found, JSON.stringify(attribution) + |
| ' is not found in ' + JSON.stringify(expected) + '.'); |
| } |
| |
| function checkBreakdown(breakdown, expected) { |
| assert_own_property(breakdown, 'bytes'); |
| assert_greater_than_equal(breakdown.bytes, 0); |
| assert_own_property(breakdown, 'types'); |
| for (const memoryType of breakdown.types) { |
| assert_equals(typeof memoryType, 'string'); |
| } |
| assert_own_property(breakdown, 'attribution'); |
| for (const attribution of breakdown.attribution) { |
| checkAttribution(attribution, expected); |
| } |
| } |
| |
| function isEmptyBreakdownEntry(entry) { |
| return entry.bytes === 0 && entry.attribution.length === 0 && |
| entry.types.length === 0; |
| } |
| |
| function checkMeasureMemory(result, expected) { |
| assert_own_property(result, 'bytes'); |
| assert_own_property(result, 'breakdown'); |
| let bytes = 0; |
| for (let breakdown of result.breakdown) { |
| checkBreakdown(breakdown, expected); |
| bytes += breakdown.bytes; |
| } |
| assert_equals(bytes, result.bytes); |
| for (const e of expected) { |
| if (e.required) { |
| assert_true(e.found, |
| JSON.stringify(e) + ' did not appear in the result.'); |
| } |
| } |
| assert_true(result.breakdown.some(isEmptyBreakdownEntry), |
| 'The result must include an empty breakdown entry.'); |
| } |