diff --git a/source/com/kemsky/filters/invoke.as b/source/com/kemsky/filters/invoke.as index 29c9b21..f7f0fdf 100644 --- a/source/com/kemsky/filters/invoke.as +++ b/source/com/kemsky/filters/invoke.as @@ -7,10 +7,10 @@ package com.kemsky.filters { /** - * todo Creates function that extracts named property from value - * @param name name of the property or method (nested properties are supported: 'prop.prop1.prop2') - * @param rest - * @return function function that extracts named property or method from value + * Creates function that calls named method on value. + * @param name name of the method (nested properties are supported: 'prop.prop1.prop2.method'). + * @param rest method arguments. + * @return function function that calls named method on value. */ public function invoke(name:String, ...rest):Function { diff --git a/testSrc/Item.as b/testSrc/Item.as index a449db3..2007be0 100644 --- a/testSrc/Item.as +++ b/testSrc/Item.as @@ -21,6 +21,11 @@ package return name == item.name; } + public function method(value:*):* + { + return name + value; + } + public function toString():String { return "Item(name=" + String(name) + ", price=" + String(price) + ")"; diff --git a/testSrc/com/kemsky/filters/TestFilters.as b/testSrc/com/kemsky/filters/TestFilters.as index 4557d02..b4fa6d0 100644 --- a/testSrc/com/kemsky/filters/TestFilters.as +++ b/testSrc/com/kemsky/filters/TestFilters.as @@ -23,12 +23,63 @@ package com.kemsky.filters var s:Stream = $(item1, item2); - var i:Stream = s.filter(eq(invoke("equals", item1), true)); - assertEquals(i.length, 1); - assertEquals(i.first, item1); - //todo coverage + var result:Stream = s.filter(eq(invoke("equals", item1), true)); + assertEquals(result.length, 1); + assertEquals(result.first, item1); + + + var obj:Item = new Item("p0"); + obj.item = new Item("p1"); + obj.item.item = new Item("p2"); + obj.item.item.item = new Item("p3"); + obj.item.item.item.item = new Item("p4"); + + var nested:Stream = $(obj); + + result = nested.filter(eq(invoke("method", 1), "p01")); + assertEquals(result.length, 1); + + result = nested.filter(eq(invoke("method1", 1), undefined)); + assertEquals(result.length, 1); + + + result = nested.filter(eq(invoke("item.method", 1), "p11")); + assertEquals(result.length, 1); + + result = nested.filter(eq(invoke("item.method1", 1), undefined)); + assertEquals(result.length, 1); + + + result = nested.filter(eq(invoke("item.item.method", 1), "p21")); + assertEquals(result.length, 1); + + result = nested.filter(eq(invoke("item.item.method1", 1), undefined)); + assertEquals(result.length, 1); + + + result = nested.filter(eq(invoke("item.item.item.method", 1), "p31")); + assertEquals(result.length, 1); + + result = nested.filter(eq(invoke("item.item.item.method1", 1), undefined)); + assertEquals(result.length, 1); + + + result = nested.filter(eq(invoke("item.item.item.item.method", 1), "p41")); + assertEquals(result.length, 1); + + result = nested.filter(eq(invoke("item.item.item.item.method1", 1), undefined)); + assertEquals(result.length, 1); + + try + { + nested.filter(eq(invoke("item.item.item.item.item.method", 1), "p51")); + assertTrue(false); + } + catch(e:Error){} + } + [Test] public function testType():void {