From dfe84d8f48e97db992d1b70382a2e531b91a1607 Mon Sep 17 00:00:00 2001 From: James deBoer Date: Thu, 20 Mar 2014 12:20:49 -0700 Subject: [PATCH] feat(expect): Move JQuery.text to Expect.toHaveText() and element.text For #219 --- test/_specs.dart | 10 +- test/_specs_spec.dart | 2 +- test/core_dom/compiler_spec.dart | 42 +++---- test/core_dom/ng_mustache_spec.dart | 6 +- test/core_dom/view_spec.dart | 8 +- test/directive/ng_bind_spec.dart | 6 +- test/directive/ng_non_bindable_spec.dart | 20 +-- test/directive/ng_repeat_spec.dart | 153 +++++++++++------------ 8 files changed, 127 insertions(+), 120 deletions(-) diff --git a/test/_specs.dart b/test/_specs.dart index a7b3c1544..e3be0df18 100644 --- a/test/_specs.dart +++ b/test/_specs.dart @@ -51,6 +51,7 @@ class Expect { toBeNotNull() => unit.expect(actual, unit.isNotNull); toHaveHtml(expected) => unit.expect(_toHtml(actual), unit.equals(expected)); + toHaveText(expected) => unit.expect(_elementText(actual), unit.equals(expected)); toHaveBeenCalled() => unit.expect(actual.called, true, reason: 'method not called'); toHaveBeenCalledOnce() => unit.expect(actual.count, 1, reason: 'method invoked ${actual.count} expected once'); @@ -117,6 +118,14 @@ class Expect { } } + _elementText(node) { + if (node is List) { + var acc = ''; + node.forEach((n) { acc += _elementText(n); }); + return acc; + } + return node.text; + } } class NotExpect { @@ -222,7 +231,6 @@ class JQuery extends DelegatingList { (n, v) => n.setInnerHtml(v, treeSanitizer: new NullTreeSanitizer()), html); val([String text]) => accessor((n) => n.value, (n, v) => n.value = v); - text([String text]) => accessor((n) => n.text, (n, v) => n.text = v, text); contents() => fold(new JQuery(), (jq, node) => jq..addAll(node.nodes)); eq(num childIndex) => $(this[childIndex]); remove(_) => forEach((n) => n.remove()); diff --git a/test/_specs_spec.dart b/test/_specs_spec.dart index d9d096432..dc1a9c073 100644 --- a/test/_specs_spec.dart +++ b/test/_specs_spec.dart @@ -22,7 +22,7 @@ main() { it('should return the shadowRoot if one exists', () { var elts = $('
'); elts[0].createShadowRoot().innerHtml = "Hello shadow"; - expect(elts.shadowRoot().text()).toEqual("Hello shadow"); + expect(elts.shadowRoot()[0].text).toEqual("Hello shadow"); }); it('should return empty list if there is no shadowRoot', () { diff --git a/test/core_dom/compiler_spec.dart b/test/core_dom/compiler_spec.dart index c88634fe9..341eb66d3 100644 --- a/test/core_dom/compiler_spec.dart +++ b/test/core_dom/compiler_spec.dart @@ -45,13 +45,13 @@ void main() { beforeEach(inject((TestBed tb) => _ = tb)); it('should compile basic hello world', () { - var element = $(_.compile('
')); + var element = _.compile('
'); _.rootScope.context['name'] = 'angular'; - expect(element.text()).toEqual(''); + expect(element.text).toEqual(''); _.rootScope.apply(); - expect(element.text()).toEqual('angular'); + expect(element.text).toEqual('angular'); }); it('should not throw on an empty list', () { @@ -69,13 +69,13 @@ void main() { }); it('should compile a directive in a child', () { - var element = $(_.compile('
')); + var element = _.compile('
'); _.rootScope.context['name'] = 'angular'; - expect(element.text()).toEqual(''); + expect(element.text).toEqual(''); _.rootScope.apply(); - expect(element.text()).toEqual('angular'); + expect(element.text).toEqual('angular'); }); it('should compile repeater', () { @@ -93,12 +93,12 @@ void main() { }); it('should compile a text child of a basic repeater', () { - var element = $(_.compile( + var element = _.compile( '
' + '{{r}}' + - '
')); + ''); _.rootScope.apply(); - expect(element.text()).toEqual('12'); + expect(element.text).toEqual('12'); }); it('should compile a text child of a repeat with a directive', () { @@ -109,14 +109,14 @@ void main() { }); it('should compile a sibling template directive', () { - var element = $(_.compile( + var element = _.compile( '
' '' '
{{value}}
' - '
')); + ''); _.rootScope.apply(); - expect(element.text()).toEqual('blank12'); + expect(element.text).toEqual('blank12'); }); it('should compile repeater with children', (Compiler $compile) { @@ -134,26 +134,26 @@ void main() { }); it('should compile text', (Compiler $compile) { - var element = $(_.compile('
{{name}}!
')); + var element = _.compile('
{{name}}!
'); _.rootScope.context['name'] = 'OK'; microLeap(); _.rootScope.apply(); - expect(element.text()).toEqual('OK!'); + expect(element.text).toEqual('OK!'); }); it('should compile nested repeater', (Compiler $compile) { - var element = $(_.compile( + var element = _.compile( '
' + '
    ' + '
  • {{li}}
  • ' + '
' + - '
')); + ''); _.rootScope.context['uls'] = [['A'], ['b']]; _.rootScope.apply(); - expect(element.text()).toEqual('Ab'); + expect(element.text).toEqual('Ab'); }); it('should compile two directives with the same selector', (Logger log) { @@ -189,12 +189,12 @@ void main() { }); it('should interpolate text nodes', () { - var element = $(_.compile('
{{name}}
')); + var element = _.compile('
{{name}}
'); _.rootScope.context['name'] = 'angular'; _.rootScope.apply(); - expect(element.text()).toEqual('angular'); + expect(element.text).toEqual('angular'); }); }); @@ -445,11 +445,11 @@ void main() { })); it('should publish directive controller into the scope', async((NgZone zone) { - var element = $(_.compile(r'
{{ctrlName.value}}
')); + var element = _.compile(r'
{{ctrlName.value}}
'); microLeap(); _.rootScope.apply(); - expect(element.text()).toEqual('WORKED'); + expect(element.text).toEqual('WORKED'); })); it('should "publish" controller to injector under provided publishTypes', () { diff --git a/test/core_dom/ng_mustache_spec.dart b/test/core_dom/ng_mustache_spec.dart index 21b9e023b..b079f6295 100644 --- a/test/core_dom/ng_mustache_spec.dart +++ b/test/core_dom/ng_mustache_spec.dart @@ -12,16 +12,16 @@ main() { beforeEach(inject((TestBed tb) => _ = tb)); it('should replace {{}} in text', inject((Compiler $compile, Scope rootScope, Injector injector, DirectiveMap directives) { - var element = $('
{{name}}!
'); + var element = es('
{{name}}!
'); var template = $compile(element, directives); rootScope.context['name'] = 'OK'; var view = template(injector); - element = $(view.nodes); + element = view.nodes; rootScope.apply(); - expect(element.text()).toEqual('OK!'); + expect(element).toHaveText('OK!'); })); describe('observe/flush phase', () { diff --git a/test/core_dom/view_spec.dart b/test/core_dom/view_spec.dart index bb19e83e7..3f70fb609 100644 --- a/test/core_dom/view_spec.dart +++ b/test/core_dom/view_spec.dart @@ -113,7 +113,7 @@ main() { anchor.insert(a); anchor.insert(b, insertAfter: a); - expect($rootElement.text()).toEqual('AaBb'); + expect($rootElement[0].text).toEqual('AaBb'); }); it('should remove the last view', () { @@ -163,11 +163,11 @@ main() { // view after the element. outerAnchor.insert(outterBoundViewFactory(null)); - expect($rootElement.text()).toEqual('text'); + expect($rootElement[0].text).toEqual('text'); anchor.remove(outerView); - expect($rootElement.text()).toEqual(''); + expect($rootElement[0].text).toEqual(''); }); }); @@ -177,7 +177,7 @@ main() { anchor.insert(a); anchor.insert(b, insertAfter: a); - expect($rootElement.text()).toEqual('AaBb'); + expect($rootElement[0].text).toEqual('AaBb'); }); diff --git a/test/directive/ng_bind_spec.dart b/test/directive/ng_bind_spec.dart index 81bfaf89b..af65f7f9d 100644 --- a/test/directive/ng_bind_spec.dart +++ b/test/directive/ng_bind_spec.dart @@ -9,11 +9,11 @@ main() { beforeEach((TestBed tb) => _ = tb); it('should set.text', (Scope scope, Injector injector, Compiler compiler, DirectiveMap directives) { - var element = $('
'); - compiler(element, directives)(injector, element); + var element = e('
'); + compiler([element], directives)(injector, [element]); scope.context['a'] = "abc123"; scope.apply(); - expect(element.text()).toEqual('abc123'); + expect(element.text).toEqual('abc123'); }); diff --git a/test/directive/ng_non_bindable_spec.dart b/test/directive/ng_non_bindable_spec.dart index 9015a1386..a2ec3fb3d 100644 --- a/test/directive/ng_non_bindable_spec.dart +++ b/test/directive/ng_non_bindable_spec.dart @@ -10,7 +10,7 @@ main() { it('should set ignore all other markup/directives on the descendent nodes', (Scope scope, Injector injector, Compiler compiler, DirectiveMap directives) { - var element = $('
' + + Element element = e('
' + ' {{a}}' + ' ' + '
' + @@ -19,21 +19,21 @@ main() { ' {{a}}' + ' ' + '
'); - compiler(element, directives)(injector, element); + compiler([element], directives)(injector, [element]); scope.context['a'] = "one"; scope.context['b'] = "two"; scope.apply(); // Bindings not contained by ng-non-bindable should resolve. - expect(element.find("#s1").text().trim()).toEqual('one'); - expect(element.find("#s2").text().trim()).toEqual('two'); - expect(element.find("#s3").text().trim()).toEqual('one'); - expect(element.find("#s4").text().trim()).toEqual('two'); + expect(element.querySelector("#s1").text.trim()).toEqual('one'); + expect(element.querySelector("#s2").text.trim()).toEqual('two'); + expect(element.querySelector("#s3").text.trim()).toEqual('one'); + expect(element.querySelector("#s4").text.trim()).toEqual('two'); // Bindings contained by ng-non-bindable should be left alone. - var nonBindableDiv = element.find("div"); - expect(nonBindableDiv[0]).toHaveHtml('{{b}}'); - expect(nonBindableDiv.text().trim()).toEqual('{{b}}'); + var nonBindableDiv = element.querySelector("div"); + expect(nonBindableDiv).toHaveHtml('{{b}}'); + expect(nonBindableDiv.text.trim()).toEqual('{{b}}'); // Bindings on the same node are processed. - expect(nonBindableDiv.attr('foo')).toEqual('one'); + expect(nonBindableDiv.attributes['foo']).toEqual('one'); }); }); } diff --git a/test/directive/ng_repeat_spec.dart b/test/directive/ng_repeat_spec.dart index b4598faa2..0e81bcebe 100644 --- a/test/directive/ng_repeat_spec.dart +++ b/test/directive/ng_repeat_spec.dart @@ -4,19 +4,20 @@ import '../_specs.dart'; main() { describe('NgRepeater', () { - var element, $compile, scope, $exceptionHandler, directives; + Element element; + var $compile, scope, $exceptionHandler, directives; beforeEach((Injector injector, Scope $rootScope, Compiler compiler, DirectiveMap _directives) { $exceptionHandler = injector.get(ExceptionHandler); scope = $rootScope; $compile = (html, [scope]) { - element = $(html); - var viewFactory = compiler(element, _directives); + element = e(html); + var viewFactory = compiler([element], _directives); var blockInjector = injector; if (scope != null) { viewFactory.bind(injector)(scope); } else { - viewFactory(injector, element); + viewFactory(injector, [element]); } return element; }; @@ -24,23 +25,23 @@ main() { }); it(r'should set create a list of items', (Scope scope, Compiler compiler, Injector injector) { - var element = $('
{{item}}
'); + var element = es('
{{item}}
'); ViewFactory viewFactory = compiler(element, directives); View view = viewFactory(injector, element); scope.context['items'] = ['a', 'b']; scope.apply(); - expect(element.text()).toEqual('ab'); + expect(element).toHaveText('ab'); }); it(r'should set create a list of items from iterable', (Scope scope, Compiler compiler, Injector injector) { - var element = $('
{{item}}
'); + var element = es('
{{item}}
'); ViewFactory viewFactory = compiler(element, directives); View view = viewFactory(injector, element); scope.context['items'] = ['a', 'b'].map((i) => i); // makes an iterable scope.apply(); - expect(element.text()).toEqual('ab'); + expect(element).toHaveText('ab'); }); @@ -53,21 +54,21 @@ main() { // INIT scope.context['items'] = [{"name": 'misko'}, {"name":'shyam'}]; scope.apply(); - expect(element.find('li').length).toEqual(2); - expect(element.text()).toEqual('misko;shyam;'); + expect(element.querySelectorAll('li').length).toEqual(2); + expect(element.text).toEqual('misko;shyam;'); // GROW scope.context['items'].add({"name": 'adam'}); scope.apply(); - expect(element.find('li').length).toEqual(3); - expect(element.text()).toEqual('misko;shyam;adam;'); + expect(element.querySelectorAll('li').length).toEqual(3); + expect(element.text).toEqual('misko;shyam;adam;'); // SHRINK scope.context['items'].removeLast(); scope.context['items'].removeAt(0); scope.apply(); - expect(element.find('li').length).toEqual(1); - expect(element.text()).toEqual('shyam;'); + expect(element.querySelectorAll('li').length).toEqual(1); + expect(element.text).toEqual('shyam;'); }); @@ -79,8 +80,8 @@ main() { '' + '
'); scope.apply(); - expect(element.find('ul').length).toEqual(1); - expect(element.find('li').length).toEqual(0); + expect(element.querySelectorAll('ul').length).toEqual(1); + expect(element.querySelectorAll('li').length).toEqual(0); }); @@ -90,7 +91,7 @@ main() { scope.context['items'] = ['foo', 'bar', 'baz']; scope.context['myFilter'] = (String item) => item.startsWith('b'); scope.apply(); - expect(element.find('span').length).toEqual(2); + expect(element.querySelectorAll('span').length).toEqual(2); }); @@ -102,13 +103,13 @@ main() { ''); scope.context['items'] = [{"id": 'misko'}, {"id": 'igor'}]; scope.apply(); - var li0 = element.find('li')[0]; - var li1 = element.find('li')[1]; + var li0 = element.querySelectorAll('li')[0]; + var li1 = element.querySelectorAll('li')[1]; scope.context['items'].add(scope.context['items'].removeAt(0)); scope.apply(); - expect(element.find('li')[0]).toBe(li1); - expect(element.find('li')[1]).toBe(li0); + expect(element.querySelectorAll('li')[0]).toBe(li1); + expect(element.querySelectorAll('li')[1]).toBe(li0); }); @@ -119,13 +120,13 @@ main() { ''); scope.context['items'] = [{"name": 'misko'}, {"name": 'igor'}]; scope.apply(); - var li0 = element.find('li')[0]; - var li1 = element.find('li')[1]; + var li0 = element.querySelectorAll('li')[0]; + var li1 = element.querySelectorAll('li')[1]; scope.context['items'].add(scope.context['items'].removeAt(0)); scope.apply(); - expect(element.find('li')[0]).toBe(li1); - expect(element.find('li')[1]).toBe(li0); + expect(element.querySelectorAll('li')[0]).toBe(li1); + expect(element.querySelectorAll('li')[1]).toBe(li0); }); @@ -138,92 +139,90 @@ main() { // INIT scope.context['items'] = [true, true, true]; scope.apply(); - expect(element.find('li').length).toEqual(3); - expect(element.text()).toEqual('true;true;true;'); + expect(element.querySelectorAll('li').length).toEqual(3); + expect(element.text).toEqual('true;true;true;'); scope.context['items'] = [false, true, true]; scope.apply(); - expect(element.find('li').length).toEqual(3); - expect(element.text()).toEqual('false;true;true;'); + expect(element.querySelectorAll('li').length).toEqual(3); + expect(element.text).toEqual('false;true;true;'); scope.context['items'] = [false, true, false]; scope.apply(); - expect(element.find('li').length).toEqual(3); - expect(element.text()).toEqual('false;true;false;'); + expect(element.querySelectorAll('li').length).toEqual(3); + expect(element.text).toEqual('false;true;false;'); scope.context['items'] = [true]; scope.apply(); - expect(element.find('li').length).toEqual(1); - expect(element.text()).toEqual('true;'); + expect(element.querySelectorAll('li').length).toEqual(1); + expect(element.text).toEqual('true;'); scope.context['items'] = [true, true, false]; scope.apply(); - expect(element.find('li').length).toEqual(3); - expect(element.text()).toEqual('true;true;false;'); + expect(element.querySelectorAll('li').length).toEqual(3); + expect(element.text).toEqual('true;true;false;'); scope.context['items'] = [true, false, false]; scope.apply(); - expect(element.find('li').length).toEqual(3); - expect(element.text()).toEqual('true;false;false;'); + expect(element.querySelectorAll('li').length).toEqual(3); + expect(element.text).toEqual('true;false;false;'); // string scope.context['items'] = ['a', 'a', 'a']; scope.apply(); - expect(element.find('li').length).toEqual(3); - expect(element.text()).toEqual('a;a;a;'); + expect(element.querySelectorAll('li').length).toEqual(3); + expect(element.text).toEqual('a;a;a;'); scope.context['items'] = ['ab', 'a', 'a']; scope.apply(); - expect(element.find('li').length).toEqual(3); - expect(element.text()).toEqual('ab;a;a;'); + expect(element.querySelectorAll('li').length).toEqual(3); + expect(element.text).toEqual('ab;a;a;'); scope.context['items'] = ['test']; scope.apply(); - expect(element.find('li').length).toEqual(1); - expect(element.text()).toEqual('test;'); + expect(element.querySelectorAll('li').length).toEqual(1); + expect(element.text).toEqual('test;'); scope.context['items'] = ['same', 'value']; scope.apply(); - expect(element.find('li').length).toEqual(2); - expect(element.text()).toEqual('same;value;'); + expect(element.querySelectorAll('li').length).toEqual(2); + expect(element.text).toEqual('same;value;'); // number scope.context['items'] = [12, 12, 12]; scope.apply(); - expect(element.find('li').length).toEqual(3); - expect(element.text()).toEqual('12;12;12;'); + expect(element.querySelectorAll('li').length).toEqual(3); + expect(element.text).toEqual('12;12;12;'); scope.context['items'] = [53, 12, 27]; scope.apply(); - expect(element.find('li').length).toEqual(3); - expect(element.text()).toEqual('53;12;27;'); + expect(element.querySelectorAll('li').length).toEqual(3); + expect(element.text).toEqual('53;12;27;'); scope.context['items'] = [89]; scope.apply(); - expect(element.find('li').length).toEqual(1); - expect(element.text()).toEqual('89;'); + expect(element.querySelectorAll('li').length).toEqual(1); + expect(element.text).toEqual('89;'); scope.context['items'] = [89, 23]; scope.apply(); - expect(element.find('li').length).toEqual(2); - expect(element.text()).toEqual('89;23;'); + expect(element.querySelectorAll('li').length).toEqual(2); + expect(element.text).toEqual('89;23;'); }); }); it(r'should error on wrong parsing of ngRepeat', () { - element = $('
'); expect(() { - $compile(element); + $compile('
'); }).toThrow("[NgErr7] ngRepeat error! Expected expression in form of '_item_ in _collection_[ track by _id_]' but got 'i dont parse'."); }); it("should throw error when left-hand-side of ngRepeat can't be parsed", () { - element = $('
'); expect(() { - $compile(element); + $compile('
'); }).toThrow("[NgErr8] ngRepeat error! '_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got 'i dont parse'."); }); @@ -236,7 +235,7 @@ main() { ''); scope.context['items'] = ['misko', 'shyam', 'frodo']; scope.apply(); - expect(element.text()).toEqual('misko:0|shyam:1|frodo:2|'); + expect(element.text).toEqual('misko:0|shyam:1|frodo:2|'); }); @@ -248,12 +247,12 @@ main() { ''); scope.context['items'] = ['misko', 'shyam', 'doug']; scope.apply(); - expect(element.text()). + expect(element.text). toEqual('misko:true-false-false|shyam:false-true-false|doug:false-false-true|'); scope.context['items'].add('frodo'); scope.apply(); - expect(element.text()). + expect(element.text). toEqual('misko:true-false-false|' + 'shyam:false-true-false|' + 'doug:false-true-false|' + @@ -262,11 +261,11 @@ main() { scope.context['items'].removeLast(); scope.context['items'].removeLast(); scope.apply(); - expect(element.text()).toEqual('misko:true-false-false|shyam:false-false-true|'); + expect(element.text).toEqual('misko:true-false-false|shyam:false-false-true|'); scope.context['items'].removeLast(); scope.apply(); - expect(element.text()).toEqual('misko:true-false-true|'); + expect(element.text).toEqual('misko:true-false-true|'); }); it(r'should report odd', () { @@ -276,20 +275,20 @@ main() { ''); scope.context['items'] = ['misko', 'shyam', 'doug']; scope.apply(); - expect(element.text()).toEqual('misko:false-true|shyam:true-false|doug:false-true|'); + expect(element.text).toEqual('misko:false-true|shyam:true-false|doug:false-true|'); scope.context['items'].add('frodo'); scope.apply(); - expect(element.text()).toEqual('misko:false-true|shyam:true-false|doug:false-true|frodo:true-false|'); + expect(element.text).toEqual('misko:false-true|shyam:true-false|doug:false-true|frodo:true-false|'); scope.context['items'].removeLast(); scope.context['items'].removeLast(); scope.apply(); - expect(element.text()).toEqual('misko:false-true|shyam:true-false|'); + expect(element.text).toEqual('misko:false-true|shyam:true-false|'); scope.context['items'].removeLast(); scope.apply(); - expect(element.text()).toEqual('misko:false-true|'); + expect(element.text).toEqual('misko:false-true|'); }); it(r'should repeat over nested arrays', () { @@ -302,7 +301,7 @@ main() { scope.context['groups'] = [['a', 'b'], ['c','d']]; scope.apply(); - expect(element.text()).toEqual('a|b|Xc|d|X'); + expect(element.text).toEqual('a|b|Xc|d|X'); }); @@ -321,14 +320,14 @@ main() { scope.context['items'] = [a, b, c]; scope.apply(); - lis = element.find('li'); + lis = element.querySelectorAll('li'); }); it(r'should preserve the order of elements', () { scope.context['items'] = [a, c, d]; scope.apply(); - var newElements = element.find('li'); + var newElements = element.querySelectorAll('li'); expect(newElements[0]).toEqual(lis[0]); expect(newElements[1]).toEqual(lis[2]); expect(newElements[2] == lis[1]).toEqual(false); @@ -344,13 +343,13 @@ main() { // recover scope.context['items'] = [a]; scope.apply(); - var newElements = element.find('li'); + var newElements = element.querySelectorAll('li'); expect(newElements.length).toEqual(1); expect(newElements[0]).toEqual(lis[0]); scope.context['items'] = []; scope.apply(); - newElements = element.find('li'); + newElements = element.querySelectorAll('li'); expect(newElements.length).toEqual(0); }); @@ -364,13 +363,13 @@ main() { // recover scope.context['items'] = [a]; scope.apply(); - var newElements = element.find('li'); + var newElements = element.querySelectorAll('li'); expect(newElements.length).toEqual(1); expect(newElements[0]).toEqual(lis[0]); scope.context['items'] = []; scope.apply(); - newElements = element.find('li'); + newElements = element.querySelectorAll('li'); expect(newElements.length).toEqual(0); }); @@ -378,11 +377,11 @@ main() { it(r'should reverse items when the collection is reversed', () { scope.context['items'] = [a, b, c]; scope.apply(); - lis = element.find('li'); + lis = element.querySelectorAll('li'); scope.context['items'] = [c, b, a]; scope.apply(); - var newElements = element.find('li'); + var newElements = element.querySelectorAll('li'); expect(newElements.length).toEqual(3); expect(newElements[0]).toEqual(lis[2]); expect(newElements[1]).toEqual(lis[1]); @@ -396,12 +395,12 @@ main() { scope.context['items'] = ['hello', 'cau', 'ahoj']; scope.apply(); - lis = element.find('li'); + lis = element.querySelectorAll('li'); lis[2].id = 'yes'; scope.context['items'] = ['ahoj', 'hello', 'cau']; scope.apply(); - var newLis = element.find('li'); + var newLis = element.querySelectorAll('li'); expect(newLis.length).toEqual(3); expect(newLis[0]).toEqual(lis[2]); expect(newLis[1]).toEqual(lis[0]);