Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3535)

Unified Diff: chrome/test/data/webui/media_router/media_router_container_tests.js

Issue 1744563003: Splitting media router browser tests into separate test cases. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed nits Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/test/data/webui/media_router/media_router_container_tests.js
diff --git a/chrome/test/data/webui/media_router/media_router_container_tests.js b/chrome/test/data/webui/media_router/media_router_container_tests.js
index 0696a2218c62eeb8c7e53cfc3d5cad7bc49a55ad..446b098fc9ca3a34ff0a2ec8291b4ab1f2b0f71f 100644
--- a/chrome/test/data/webui/media_router/media_router_container_tests.js
+++ b/chrome/test/data/webui/media_router/media_router_container_tests.js
@@ -66,24 +66,6 @@ cr.define('media_router_container', function() {
'sink-list-view',
];
- /**
- * Search text that will match all sinks.
- * @type {string}
- */
- var searchTextAll;
-
- /**
- * Search text that won't match any sink in fakeSinkList.
- * @type {string}
- */
- var searchTextNone;
-
- /**
- * Search text that will match exactly one sink.
- * @type {string}
- */
- var searchTextOne;
-
// Checks whether |view| matches the current view of |container|.
var checkCurrentView = function(view) {
assertEquals(view, container.currentView_);
@@ -1005,647 +987,6 @@ cr.define('media_router_container', function() {
});
});
});
-
- // Tests that clicking the search icon will cause the container to enter
- // filter view.
- test('click search icon', function(done) {
- MockInteractions.tap(container.$['sink-search-icon']);
- setTimeout(function() {
- checkCurrentView(media_router.MediaRouterView.FILTER);
- assertEquals(container.$['sink-search-input'],
- container.shadowRoot.activeElement);
- done();
- });
- });
-
- // Tests that focusing the sink search input will cause the container to
- // enter filter view.
- test('focus sink search input', function(done) {
- MockInteractions.focus(container.$['sink-search-input']);
- setTimeout(function() {
- checkCurrentView(media_router.MediaRouterView.FILTER);
- assertEquals(container.$['sink-search-input'],
- container.shadowRoot.activeElement);
- done();
- });
- });
-
- // Tests that the back button in the FILTER view returns |container| to
- // the SINK_LIST view.
- test('filter view back button', function(done) {
- MockInteractions.tap(container.$['sink-search-icon']);
- setTimeout(function() {
- MockInteractions.tap(
- container.$['container-header'].$['back-button']);
- checkCurrentView(media_router.MediaRouterView.SINK_LIST);
- done();
- });
- });
-
- // Tests that pressing the Escape key in the FILTER view returns
- // |container| to the SINK_LIST view.
- test('filter view escape key', function(done) {
- MockInteractions.tap(container.$['sink-search-icon']);
- setTimeout(function() {
- MockInteractions.pressAndReleaseKeyOn(
- container, media_router.KEYCODE_ESC);
- checkCurrentView(media_router.MediaRouterView.SINK_LIST);
- done();
- });
- });
-
- // Tests that expected elements are visible when in filter view.
- test('filter view visibility', function(done) {
- checkElementsVisibleWithId(['container-header',
- 'device-missing',
- 'sink-search',
- 'sink-list-view']);
- // Clicking the search icon should transition |container| to FILTER
- // view.
- MockInteractions.tap(container.$['sink-search-icon']);
- setTimeout(function() {
- checkElementsVisibleWithId(['container-header',
- 'device-missing',
- 'sink-search',
- 'sink-list-view']);
-
- // Adding sinks should populate the search list.
- container.allSinks = fakeSinkList;
- setTimeout(function() {
- checkElementsVisibleWithId(['container-header',
- 'search-results',
- 'sink-search',
- 'sink-list-view']);
- // Typing text that doesn't match any sinks should display a 'no
- // matches' message.
- container.$['sink-search-input'].value = searchTextNone;
- checkElementsVisibleWithId(['container-header',
- 'no-search-matches',
- 'sink-search',
- 'sink-list-view']);
- // Changing that text to something that matches at least one sink
- // should show the matching sinks again.
- container.$['sink-search-input'].value = searchTextOne;
- setTimeout(function() {
- checkElementsVisibleWithId(['container-header',
- 'search-results',
- 'sink-search',
- 'sink-list-view']);
- // Clicking the back button should leave |searchTextOne| in the
- // input but return to the SINK_LIST view.
- MockInteractions.tap(
- container.$['container-header'].$['back-button']);
- checkElementsVisibleWithId(['container-header',
- 'sink-search',
- 'sink-list',
- 'sink-list-view']);
- // When the search button is clicked again, the matching sinks
- // should be shown again. This doesn't prove that the matching
- // worked when returning to the FILTER view though, just that it
- // at least shows some sort of sink list as search results.
- MockInteractions.tap(container.$['sink-search-icon']);
- checkElementsVisibleWithId(['container-header',
- 'search-results',
- 'sink-search',
- 'sink-list-view']);
-
- container.$['sink-search-input'].value = searchTextNone;
- // Clicking the back button should leave |searchTextNone| in the
- // input but return to the SINK_LIST view.
- MockInteractions.tap(
- container.$['container-header'].$['back-button']);
- checkElementsVisibleWithId(['container-header',
- 'sink-search',
- 'sink-list',
- 'sink-list-view']);
- // When the search button is clicked again, there should be no
- // matches because |searchTextNone| should still be used to
- // filter.
- MockInteractions.tap(container.$['sink-search-icon']);
- checkElementsVisibleWithId(['container-header',
- 'no-search-matches',
- 'sink-search',
- 'sink-list-view']);
- // Pressing the Escape key in FILTER view should return
- // |container| to SINK_LIST view and not exit the dialog.
- MockInteractions.pressAndReleaseKeyOn(
- container, media_router.KEYCODE_ESC);
- checkElementsVisibleWithId(['container-header',
- 'sink-search',
- 'sink-list',
- 'sink-list-view']);
- done();
- });
- });
- });
- });
-
- // Tests that entering filter view with text already in the search input
- // will immediately use that text to filter the sinks. This tests the case
- // that the text matches one sink.
- test('existing search text filters success', function(done) {
- container.allSinks = fakeSinkList;
- container.$['sink-search-input'].value = searchTextOne;
- MockInteractions.tap(container.$['sink-search-icon']);
- setTimeout(function() {
- var searchResults =
- container.$$('#search-results').querySelectorAll('paper-item');
- assertEquals(1, searchResults.length);
- done();
- });
- });
-
- // Tests that entering filter view with text already in the search input
- // will immediately use that text to filter the sinks. This tests the case
- // that the text doesn't match any sinks.
- test('existing search text filters fail', function(done) {
- container.allSinks = fakeSinkList;
- container.$['sink-search-input'].value = searchTextNone;
- MockInteractions.tap(container.$['sink-search-icon']);
- setTimeout(function() {
- var searchResults =
- container.$$('#search-results').querySelectorAll('paper-item');
- assertEquals(0, searchResults.length);
- done();
- });
- });
-
- // Tests that the text in the search input is not cleared or altered after
- // leaving filter view by pressing the back button in the header.
- test('search text persists back button', function(done) {
- MockInteractions.tap(container.$['sink-search-icon']);
- setTimeout(function() {
- container.$['sink-search-input'].value = searchTextAll;
-
- MockInteractions.tap(
- container.$['container-header'].$['back-button']);
- assertEquals(searchTextAll, container.$['sink-search-input'].value);
- done();
- });
- });
-
- // Tests that the text in the search input is not cleared or altered after
- // leaving filter view by pressing the Escape key.
- test('search text persists escape key', function(done) {
- MockInteractions.tap(container.$['sink-search-icon']);
- setTimeout(function() {
- container.$['sink-search-input'].value = searchTextAll;
-
- MockInteractions.pressAndReleaseKeyOn(
- container, media_router.KEYCODE_ESC);
- assertEquals(searchTextAll, container.$['sink-search-input'].value);
- done();
- });
- });
-
- // Tests that the correct number of results are returned in the search
- // results.
- test('search text filters correct number', function(done) {
- container.allSinks = fakeSinkList;
- MockInteractions.tap(container.$['sink-search-icon']);
- var searchInput = container.$['sink-search-input'];
- setTimeout(function() {
- searchInput.value = searchTextAll;
- var searchResults =
- container.$$('#search-results').querySelectorAll('paper-item');
- assertEquals(fakeSinkList.length, searchResults.length);
-
- searchInput.value = searchTextOne;
- setTimeout(function() {
- var searchResults =
- container.$$('#search-results').querySelectorAll('paper-item');
- assertEquals(1, searchResults.length);
-
- searchInput.value = searchTextNone;
- setTimeout(function() {
- var searchResults =
- container.$$('#search-results')
- .querySelectorAll('paper-item');
- assertEquals(0, searchResults.length);
- done();
- });
- });
- });
- });
-
- // Tests that the correct item is returned when searching using the first
- // fake sink's name.
- test('search text filters correct text', function(done) {
- container.allSinks = fakeSinkList;
- MockInteractions.tap(container.$['sink-search-icon']);
- var testSinkName = fakeSinkList[0].name;
- container.$['sink-search-input'].value = testSinkName;
- setTimeout(function() {
- var searchResults =
- container.$$('#search-results').querySelectorAll('paper-item');
- assertEquals(1, searchResults.length);
- // This selector works only because there's only one result in the
- // list.
- var searchResultText =
- container.$$('media-router-search-highlighter').text;
- assertEquals(testSinkName.trim(), searchResultText.trim());
- done();
- });
- });
-
- // Tests that a route can be created from search results the same as in
- // the sink list.
- test('create route from search result without a route', function(done) {
- container.allSinks = fakeSinkList;
- MockInteractions.tap(container.$['sink-search-icon']);
- setTimeout(function() {
- var searchResults =
- container.$$('#search-results').querySelectorAll('paper-item');
- container.addEventListener('create-route', function(data) {
- assertEquals(fakeSinkList[1].id, data.detail.sinkId);
- done();
- });
- MockInteractions.tap(searchResults[1]);
- });
- });
-
- // Tests that clicking a sink in the search results that already has an
- // associated route will transition |container| to the ROUTE_DETAILS view.
- test('navigate to route details from search result', function(done) {
- container.allSinks = fakeSinkList;
- container.routeList = fakeRouteList;
- MockInteractions.tap(container.$['sink-search-icon']);
- setTimeout(function() {
- var searchResults =
- container.$$('#search-results').querySelectorAll('paper-item');
- MockInteractions.tap(searchResults[1]);
- checkCurrentView(media_router.MediaRouterView.ROUTE_DETAILS);
- done();
- });
- });
-
- // Tests that subtext is shown in filter view the same as the sink list.
- // This is basically a copy of 'initial sink list route text' but in
- // filter view.
- test('subtext displayed in filter view', function(done) {
- // Sink 1 - no sink description, no route -> no subtext
- // Sink 2 - sink description, no route -> subtext = sink description
- // Sink 3 - no sink description, route -> subtext = route description
- // Sink 4 - sink description, route -> subtext = route description
- container.allSinks = [
- new media_router.Sink('sink id 1', 'Sink 1', null, null,
- media_router.SinkIconType.CAST,
- media_router.SinkStatus.ACTIVE, [1, 2, 3]),
- new media_router.Sink('sink id 2', 'Sink 2',
- 'Sink 2 description', null,
- media_router.SinkIconType.CAST,
- media_router.SinkStatus.ACTIVE, [1, 2, 3]),
- new media_router.Sink('sink id 3', 'Sink 3', null, null,
- media_router.SinkIconType.CAST,
- media_router.SinkStatus.PENDING, [1, 2, 3]),
- new media_router.Sink('sink id 4', 'Sink 4',
- 'Sink 4 description', null,
- media_router.SinkIconType.CAST,
- media_router.SinkStatus.PENDING, [1, 2, 3])
- ];
-
- container.routeList = [
- new media_router.Route('id 3', 'sink id 3', 'Title 3', 0, true),
- new media_router.Route('id 4', 'sink id 4', 'Title 4', 1, false),
- ];
-
- MockInteractions.tap(container.$['sink-search-icon']);
- setTimeout(function() {
- var sinkSubtextList =
- container.$$('#search-results').querySelectorAll('.sink-subtext');
-
- // There will only be 3 sink subtext entries, because Sink 1 does not
- // have any subtext.
- assertEquals(3, sinkSubtextList.length);
-
- checkElementText(container.allSinks[1].description,
- sinkSubtextList[0]);
-
- // Route description overrides sink description for subtext.
- checkElementText(container.routeList[0].description,
- sinkSubtextList[1]);
-
- checkElementText(container.routeList[1].description,
- sinkSubtextList[2]);
- done();
- });
- });
-
- // Tests that compareSearchMatches_ works correctly for zero and one
- // substring matches from the filter text. Earlier, longer matches should
- // be ordered first, in that priority order.
- test('compareSearchMatches_ test single substrings', function(done) {
- var checkEqual = function(left, right) {
- assertEquals(0, container.compareSearchMatches_(left, right));
- assertEquals(0, container.compareSearchMatches_(right, left));
- };
- var checkLess = function(left, right) {
- assertEquals(-1, container.compareSearchMatches_(left, right));
- assertEquals(1, container.compareSearchMatches_(right, left));
- };
-
- var noMatches = {sinkItem: null, substrings: []};
- var oneMatchSectionSingleChar = {sinkItem: null, substrings: [[0, 0]]};
-
- checkEqual(noMatches, noMatches);
- checkEqual(oneMatchSectionSingleChar, oneMatchSectionSingleChar);
- checkLess(oneMatchSectionSingleChar, noMatches);
-
- var oneMatchSectionBeginningLong = {sinkItem: null,
- substrings: [[0, 2]]};
- var oneMatchSectionBeginningShort = {sinkItem: null,
- substrings: [[0, 1]]};
- checkEqual(oneMatchSectionBeginningLong, oneMatchSectionBeginningLong);
- checkEqual(oneMatchSectionBeginningShort,
- oneMatchSectionBeginningShort);
-
- checkLess(oneMatchSectionBeginningLong, oneMatchSectionBeginningShort);
-
- var oneMatchSectionMiddleLong = {sinkItem: null, substrings: [[2, 4]]};
- var oneMatchSectionMiddleShort = {sinkItem: null, substrings: [[2, 3]]};
- checkEqual(oneMatchSectionMiddleLong, oneMatchSectionMiddleLong);
- checkEqual(oneMatchSectionMiddleShort, oneMatchSectionMiddleShort);
-
- checkLess(oneMatchSectionMiddleLong, oneMatchSectionMiddleShort);
-
- var oneMatchSectionEndLong = {sinkItem: null, substrings: [[4, 6]]};
- var oneMatchSectionEndShort = {sinkItem: null, substrings: [[4, 5]]};
- checkEqual(oneMatchSectionEndLong, oneMatchSectionEndLong);
- checkEqual(oneMatchSectionEndShort, oneMatchSectionEndShort);
-
- checkLess(oneMatchSectionEndLong, oneMatchSectionEndShort);
-
- // Check beginning < middle < end for both short and long matches.
- checkLess(oneMatchSectionBeginningLong, oneMatchSectionMiddleLong);
- checkLess(oneMatchSectionMiddleLong, oneMatchSectionEndLong);
- checkLess(oneMatchSectionBeginningLong, oneMatchSectionEndLong);
- checkLess(oneMatchSectionBeginningShort, oneMatchSectionMiddleShort);
- checkLess(oneMatchSectionMiddleShort, oneMatchSectionEndShort);
- checkLess(oneMatchSectionBeginningShort, oneMatchSectionEndShort);
-
- // Check some long/short transitivity
- // i.e. beginning-long < middle-long, middle-long < middle-short, so
- // check that beginning-long < middle-short
- checkLess(oneMatchSectionBeginningLong, oneMatchSectionMiddleShort);
- checkLess(oneMatchSectionBeginningShort, oneMatchSectionMiddleLong);
- checkLess(oneMatchSectionMiddleLong, oneMatchSectionEndShort);
- checkLess(oneMatchSectionMiddleShort, oneMatchSectionEndLong);
- checkLess(oneMatchSectionBeginningLong, oneMatchSectionEndShort);
- checkLess(oneMatchSectionBeginningShort, oneMatchSectionEndLong);
-
- var oneMatchBeginningOverlap = {sinkItem: null, substrings: [[0, 2]]};
- var oneMatchMiddleOverlap = {sinkItem: null, substrings: [[1, 3]]};
- var oneMatchEndOverlap = {sinkItem: null, substrings: [[2, 4]]}
-
- checkEqual(oneMatchBeginningOverlap, oneMatchBeginningOverlap);
- checkEqual(oneMatchMiddleOverlap, oneMatchMiddleOverlap);
- checkEqual(oneMatchEndOverlap, oneMatchEndOverlap);
-
- checkLess(oneMatchBeginningOverlap, oneMatchMiddleOverlap);
- checkLess(oneMatchMiddleOverlap, oneMatchEndOverlap);
- checkLess(oneMatchBeginningOverlap, oneMatchEndOverlap);
-
- done();
- });
-
- // Tests that compareSearchMatches_ works correctly for one or more
- // substring matches from the filter text. Earlier, longer matches should
- // be ordered first, in that priority order.
- test('compareSearchMatches_ test multiple substrings', function(done) {
- var checkEqual = function(left, right) {
- assertEquals(0, container.compareSearchMatches_(left, right));
- assertEquals(0, container.compareSearchMatches_(right, left));
- };
- var checkLess = function(left, right) {
- assertEquals(-1, container.compareSearchMatches_(left, right));
- assertEquals(1, container.compareSearchMatches_(right, left));
- };
-
- // Variables are named by number of substring elements followed by their
- // sort order as X_Y where they should be sorted in ascending order by
- // X.Y. For example: 1_1 < 1_2 < 2_1.
- var threeMatches1_1 = {
- sinkItem: null,
- substrings: [[0, 2], [4, 5], [7, 9]],
- };
- var threeMatches1_2 = {
- sinkItem: null,
- substrings: [[0, 2], [4, 5], [7, 8]],
- };
- var threeMatches1_3 = {
- sinkItem: null,
- substrings: [[0, 2], [4, 5], [8, 9]],
- };
- var threeMatches1_4 = {
- sinkItem: null,
- substrings: [[0, 2], [4, 4], [6, 8]],
- };
- var twoMatches2_1 = {
- sinkItem: null,
- substrings: [[0, 2], [4, 4]],
- };
- var twoMatches2_2 = {
- sinkItem: null,
- substrings: [[0, 1], [3, 5]],
- };
- var twoMatches2_3 = {
- sinkItem: null,
- substrings: [[0, 1], [4, 6]],
- };
- var twoMatches2_4 = {
- sinkItem: null,
- substrings: [[0, 1], [4, 5]],
- };
- var threeMatches2_5 = {
- sinkItem: null,
- substrings: [[0, 1], [4, 4], [6, 9]],
- };
- var oneMatch3_1 = {
- sinkItem: null,
- substrings: [[0, 1]],
- };
- var oneMatch3_2 = {
- sinkItem: null,
- substrings: [[0, 0]],
- };
-
- var orderedMatches = [
- threeMatches1_1,
- threeMatches1_2,
- threeMatches1_3,
- threeMatches1_4,
- twoMatches2_1,
- twoMatches2_2,
- twoMatches2_3,
- twoMatches2_4,
- threeMatches2_5,
- oneMatch3_1,
- oneMatch3_2,
- ];
-
- for (var i = 0; i < orderedMatches.length; ++i) {
- checkEqual(orderedMatches[i], orderedMatches[i]);
- }
- for (var i = 0; i < orderedMatches.length - 1; ++i) {
- checkLess(orderedMatches[i], orderedMatches[i+1]);
- }
- // Check some transitivity.
- for (var i = 0; i < orderedMatches.length - 2; ++i) {
- checkLess(orderedMatches[i], orderedMatches[i+2]);
- }
- for (var i = 0; i < orderedMatches.length - 3; ++i) {
- checkLess(orderedMatches[i], orderedMatches[i+3]);
- }
-
- done();
- });
-
- // Tests that computeSearchMatches_ correctly computes the matching
- // substrings of a sink name from search text.
- test('computeSearchMatches_ test', function(done) {
- var sinkName = '012345 789';
- var checkMatches = function(searchText, answer) {
- proposed = container.computeSearchMatches_(searchText, sinkName);
-
- if (answer == null || proposed == null) {
- assertEquals(answer, proposed);
- return;
- }
- assertEquals(answer.length, proposed.length);
- for (var i = 0; i < proposed.length; ++i) {
- assertEquals(answer[i].length, proposed[i].length);
- for (var j = 0; j < proposed[i].length; ++j) {
- assertEquals(answer[i][j], proposed[i][j]);
- }
- }
- };
-
- // Check search text against |sinkName| for correct match output.
- checkMatches('', []);
- checkMatches('a', null);
- checkMatches('0', [[0, 0]]);
- checkMatches('1', [[1, 1]]);
- checkMatches('012', [[0, 2]]);
- checkMatches('03', [[0, 0], [3, 3]]);
- checkMatches('210', null);
- checkMatches('01345789', [[0, 1], [3, 5], [7, 9]]);
- checkMatches('024', [[0, 0], [2, 2], [4, 4]]);
- checkMatches('09a', null);
- checkMatches(' ', [[6, 6]]);
- checkMatches('45 ', [[4, 6]]);
- checkMatches(' 78', [[6, 8]]);
- checkMatches('45 7', [[4, 7]]);
- checkMatches(' ', null);
- checkMatches('12 89', [[1, 2], [6, 6], [8, 9]]);
-
- done();
- });
-
- // Tests that computeSinkMatchingText_ correctly splits a sink name into
- // |plainText| and |highlightedText| arrays given a sink name and an array
- // of match indices.
- test('computeSinkMatchingText_ test', function(done) {
- var sinkName = '012345 789';
- var sink = new media_router.Sink('id', sinkName, null, null,
- media_router.SinkIconType.CAST,
- media_router.SinkStatus.ACTIVE, 0);
- var checkMatches = function(matchesAndAnswers) {
- var matches = matchesAndAnswers.matches;
- var plainText = matchesAndAnswers.plainText;
- var highlightedText = matchesAndAnswers.highlightedText;
-
- var proposed = container.computeSinkMatchingText_(
- {sinkItem: sink, substrings: matches});
- assertEquals(plainText.length, proposed.plainText.length);
- assertEquals(highlightedText.length, proposed.highlightedText.length);
- for (var i = 0; i < plainText.length; ++i) {
- assertEquals(plainText[i], proposed.plainText[i]);
- }
- for (var i = 0; i < highlightedText.length; ++i) {
- assertEquals(highlightedText[i], proposed.highlightedText[i]);
- }
- };
-
- // Check that |sinkName| is correctly partitioned by |matches|.
- var matchesAndAnswers1 = {
- matches: null,
- plainText: ['012345 789'],
- highlightedText: [null]
- };
- checkMatches(matchesAndAnswers1);
-
- var matchesAndAnswers2 = {
- matches: [],
- plainText: ['012345 789'],
- highlightedText: [null]
- };
- checkMatches(matchesAndAnswers2);
-
- var matchesAndAnswers3 = {
- matches: [[0, 0]],
- plainText: [null, '12345 789'],
- highlightedText: ['0', null]
- };
- checkMatches(matchesAndAnswers3);
-
- var matchesAndAnswers4 = {
- matches: [[9, 9]],
- plainText: ['012345 78'],
- highlightedText: ['9']
- };
- checkMatches(matchesAndAnswers4);
-
- var matchesAndAnswers5 = {
- matches: [[1, 1]],
- plainText: ['0', '2345 789'],
- highlightedText: ['1', null]
- };
- checkMatches(matchesAndAnswers5);
-
- var matchesAndAnswers6 = {
- matches: [[1, 2], [4, 6]],
- plainText: ['0', '3', '789'],
- highlightedText: ['12', '45 ', null]
- };
- checkMatches(matchesAndAnswers6);
-
- var matchesAndAnswers7 = {
- matches: [[0, 3], [7, 9]],
- plainText: [null, '45 '],
- highlightedText: ['0123', '789'],
- };
- checkMatches(matchesAndAnswers7);
-
- var matchesAndAnswers8 = {
- matches: [[4, 6], [9, 9]],
- plainText: ['0123', '78'],
- highlightedText: ['45 ', '9']
- };
- checkMatches(matchesAndAnswers8);
-
- var matchesAndAnswers9 = {
- matches: [[0, 1], [3, 4], [6, 7], [9, 9]],
- plainText: [null, '2', '5', '8'],
- highlightedText: ['01', '34', ' 7', '9'],
- };
- checkMatches(matchesAndAnswers9);
-
- var matchesAndAnswers10 = {
- matches: [[0, 1], [3, 4], [6, 6], [9, 9]],
- plainText: [null, '2', '5', '78'],
- highlightedText: ['01', '34', ' ', '9'],
- };
- checkMatches(matchesAndAnswers10);
-
- var matchesAndAnswers11 = {
- matches: [[5, 7]],
- plainText: ['01234', '89'],
- highlightedText: ['5 7', null],
- };
- checkMatches(matchesAndAnswers11);
-
- done();
- });
});
}

Powered by Google App Engine
This is Rietveld 408576698