You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by jo...@apache.org on 2019/11/07 22:50:41 UTC
[royale-asjs] branch develop updated: RoyaleUnitUI: work in progress
This is an automated email from the ASF dual-hosted git repository.
joshtynjala pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git
The following commit(s) were added to refs/heads/develop by this push:
new 145687f RoyaleUnitUI: work in progress
145687f is described below
commit 145687f5edd951f97c165c0e6ceb1734d910a916
Author: Josh Tynjala <jo...@apache.org>
AuthorDate: Thu Nov 7 14:50:28 2019 -0800
RoyaleUnitUI: work in progress
---
.../apache/royale/html/test/UITestItemRenderer.as | 92 +++++++++
.../org/apache/royale/html/test/UITestRunner.mxml | 210 +++++++++++++++++++++
.../royale/html/test/models/UITestRunnerModel.as | 76 ++++++++
.../org/apache/royale/html/test/models/UITestVO.as | 48 +++++
4 files changed, 426 insertions(+)
diff --git a/frameworks/projects/RoyaleUnitUI/src/org/apache/royale/html/test/UITestItemRenderer.as b/frameworks/projects/RoyaleUnitUI/src/org/apache/royale/html/test/UITestItemRenderer.as
new file mode 100644
index 0000000..1c7f733
--- /dev/null
+++ b/frameworks/projects/RoyaleUnitUI/src/org/apache/royale/html/test/UITestItemRenderer.as
@@ -0,0 +1,92 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.royale.html.test
+{
+ import org.apache.royale.html.Group;
+ import org.apache.royale.html.Label;
+ import org.apache.royale.html.beads.VerticalAlignChildren;
+ import org.apache.royale.html.beads.layouts.HorizontalLayoutWithPaddingAndGap;
+ import org.apache.royale.html.supportClasses.DataItemRenderer;
+ import org.apache.royale.html.test.models.UITestVO;
+
+ [ExcludeClass]
+ /**
+ * @private
+ */
+ public class UITestItemRenderer extends DataItemRenderer
+ {
+ public function UITestItemRenderer()
+ {
+ super();
+ this.typeNames = "UITestItemRenderer";
+ }
+
+ private var container:Group;
+ private var icon:Label;
+ private var label:Label;
+
+ override public function addedToParent():void
+ {
+ super.addedToParent();
+
+ container = new Group();
+ var layout:HorizontalLayoutWithPaddingAndGap = new HorizontalLayoutWithPaddingAndGap();
+ layout.gap = 8;
+ layout.paddingTop = 4;
+ layout.paddingBottom = 4;
+ layout.paddingLeft = 8;
+ layout.paddingRight = 8;
+ container.addBead(layout);
+ var align:VerticalAlignChildren = new VerticalAlignChildren();
+ align.alignment = "middle";
+ container.addBead(align);
+ addElement(container);
+
+ icon = new Label();
+ container.addElement(icon);
+
+ label = new Label();
+ container.addElement(label);
+ }
+
+ override public function set data(value:Object):void
+ {
+ super.data = value;
+
+ var item:UITestVO = UITestVO(value);
+ if(item.ignored)
+ {
+ icon.text = "⚪";
+ }
+ else if(item.failure)
+ {
+ icon.text = "🔴";
+ }
+ else if(item.active)
+ {
+ icon.text = "🟡"
+ }
+ else
+ {
+ icon.text = "🟢";
+ }
+ label.text = item.description;
+ }
+ }
+}
diff --git a/frameworks/projects/RoyaleUnitUI/src/org/apache/royale/html/test/UITestRunner.mxml b/frameworks/projects/RoyaleUnitUI/src/org/apache/royale/html/test/UITestRunner.mxml
new file mode 100644
index 0000000..938e4e4
--- /dev/null
+++ b/frameworks/projects/RoyaleUnitUI/src/org/apache/royale/html/test/UITestRunner.mxml
@@ -0,0 +1,210 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!---
+//
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+-->
+<js:View xmlns:fx="http://ns.adobe.com/mxml/2009"
+ xmlns:js="library://ns.apache.org/royale/basic"
+ xmlns:models="org.apache.royale.html.test.models.*"
+ implements="org.apache.royale.test.runners.notification.IRunListener"
+ percentWidth="100" percentHeight="100"
+ initComplete="resultTypesList.selectedIndex = 0;">
+ <js:beads>
+ <js:ViewDataBinding/>
+ <js:VerticalLayout/>
+ </js:beads>
+ <fx:Declarations>
+ <models:UITestRunnerModel localId="testsModel"/>
+ </fx:Declarations>
+
+ <js:Panel title="RoyaleUnit Test Results" percentWidth="100" percentHeight="50">
+ <js:beads>
+ <js:OneFlexibleChildVerticalLayout flexibleChild="resultsList"/>
+ </js:beads>
+ <js:HGroup percentWidth="100">
+ <js:Label text="Filter:"/>
+ <js:Spacer width="10"/>
+ <js:DropDownList localId="resultTypesList"
+ dataProvider="{testsModel.resultTypes}"
+ change="resultTypesList_changeHandler(event)"/>
+ </js:HGroup>
+ <js:Spacer height="2"/>
+ <js:DynamicList localId="resultsList"
+ labelField="description" dataProvider="{testsModel.results}"
+ percentWidth="100"
+ itemRenderer="org.apache.royale.html.test.UITestItemRenderer"
+ change="resultsList_changeHandler(event)">
+ <js:beads>
+ <!-- needed for filterFunction -->
+ <js:CollectionChangeUpdateForArrayListData/>
+ </js:beads>
+ </js:DynamicList>
+ </js:Panel>
+
+ <js:Panel title="Test Details" percentWidth="100" percentHeight="50"
+ visible="{!testsModel.selectedResult}">
+ <js:beads>
+ <js:VerticalLayout/>
+ </js:beads>
+ <js:Label text="No test selected"/>
+ </js:Panel>
+
+ <js:Panel title="Test Details" percentWidth="100" percentHeight="50"
+ visible="{testsModel.selectedResult}">
+ <js:beads>
+ <js:VerticalLayout/>
+ </js:beads>
+
+ <js:Label text="Function:"/>
+ <js:Label text="{testsModel.selectedResult.functionName}"/>
+
+ <js:Spacer height="10"/>
+
+ <js:Label text="Test Case:"/>
+ <js:Label text="{testsModel.selectedResult.testCaseName}"/>
+
+ <js:Spacer height="10"/>
+
+ <js:Label text="Result:"/>
+ <js:Label text="{getResultType(testsModel.selectedResult)}"/>
+
+ <js:Spacer height="10"/>
+
+ <js:VGroup visible="{testsModel.selectedResult.failure}">
+ <js:Label text="Stack Trace:"/>
+ <js:MultilineLabel text="{testsModel.selectedResult.failure.stackTrace}"
+ percentWidth="100" style="white-space:pre;overflow-x:scroll"/>
+ </js:VGroup>
+ </js:Panel>
+
+ <fx:Script>
+ <![CDATA[
+ import org.apache.royale.collections.ArrayListView;
+ import org.apache.royale.events.Event;
+ import org.apache.royale.test.runners.notification.Failure;
+ import org.apache.royale.test.runners.notification.Result;
+ import org.apache.royale.html.test.models.UITestVO;
+ import org.apache.royale.test.AssertionError;
+
+ public function testRunStarted(description:String):void
+ {
+
+ }
+
+ public function testStarted(description:String):void
+ {
+ var testResults:ArrayListView = testsModel.results;
+ testResults.addItem(new UITestVO(description));
+ }
+
+ public function testFinished(description:String):void
+ {
+ var testResults:ArrayListView = testsModel.results;
+ var item:UITestVO = testResults.getItemAt(testResults.length - 1) as UITestVO;
+ item.active = false;
+ testResults.itemUpdated(item);
+ }
+
+ public function testFailure(failure:Failure):void
+ {
+ var testResults:ArrayListView = testsModel.results;
+ var item:UITestVO = testResults.getItemAt(testResults.length - 1) as UITestVO;
+ item.failure = failure;
+ testResults.itemUpdated(item);
+ }
+
+ public function testIgnored(description:String):void
+ {
+ var testResults:ArrayListView = testsModel.results;
+ var item:UITestVO = new UITestVO(description);
+ item.active = false;
+ item.ignored = true;
+ testResults.addItem(item);
+ }
+
+ public function testRunFinished(result:Result):void
+ {
+ }
+
+ private function getResultType(item:UITestVO):String
+ {
+ if(item.active)
+ {
+ return "Active";
+ }
+ if(item.ignored)
+ {
+ return "Ignored";
+ }
+ if(item.failure)
+ {
+ if(item.failure.exception is AssertionError)
+ {
+ return "Assertion Failed";
+ }
+ return "Exception";
+ }
+ return "Passed";
+ }
+
+ private function resultsList_changeHandler(event:Event):void
+ {
+ testsModel.selectedResultIndex = resultsList.selectedIndex;
+ }
+
+ private function resultTypesList_changeHandler(event:Event):void
+ {
+ var selectedResult:UITestVO = testsModel.selectedResult;
+
+ var testResults:ArrayListView = testsModel.results;
+ var resultType:String = resultTypesList.selectedItem as String;
+ testResults.filterFunction = function(test:UITestVO):Boolean
+ {
+ switch(resultType)
+ {
+ case UITestRunnerModel.RESULT_TYPE_FAILED:
+ {
+ return test.failure;
+ }
+ case UITestRunnerModel.RESULT_TYPE_PASSED:
+ {
+ return !test.failure && !test.ignored && !test.active;
+ }
+ case UITestRunnerModel.RESULT_TYPE_IGNORED:
+ {
+ return test.ignored;
+ }
+ }
+ return true;
+ };
+ testResults.refresh();
+
+ if(selectedResult)
+ {
+ var newIndex:int = testResults.getItemIndex(selectedResult);
+ if(newIndex == -1 && testResults.length > 0)
+ {
+ newIndex = 0;
+ }
+ resultsList.selectedIndex = newIndex;
+ testsModel.selectedResultIndex = newIndex;
+ }
+ }
+ ]]>
+ </fx:Script>
+</js:View>
\ No newline at end of file
diff --git a/frameworks/projects/RoyaleUnitUI/src/org/apache/royale/html/test/models/UITestRunnerModel.as b/frameworks/projects/RoyaleUnitUI/src/org/apache/royale/html/test/models/UITestRunnerModel.as
new file mode 100644
index 0000000..8ffe730
--- /dev/null
+++ b/frameworks/projects/RoyaleUnitUI/src/org/apache/royale/html/test/models/UITestRunnerModel.as
@@ -0,0 +1,76 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.royale.html.test.models
+{
+ import org.apache.royale.collections.ArrayListView;
+ import org.apache.royale.events.Event;
+ import org.apache.royale.events.EventDispatcher;
+
+ [ExcludeClass]
+ /**
+ * @private
+ */
+ public class UITestRunnerModel extends EventDispatcher
+ {
+ public static const RESULT_TYPE_ALL:String = "All Tests";
+ public static const RESULT_TYPE_PASSED:String = "Passed";
+ public static const RESULT_TYPE_FAILED:String = "Failed";
+ public static const RESULT_TYPE_IGNORED:String = "Ignored";
+
+ public function UITestRunnerModel()
+ {
+ super();
+ }
+
+ private var _results:ArrayListView = new ArrayListView();
+
+ [Bindable]
+ public function get results():ArrayListView
+ {
+ return this._results;
+ }
+
+ [Bindable("change")]
+ public function get selectedResult():UITestVO
+ {
+ if(this.selectedResultIndex == -1)
+ {
+ return null;
+ }
+ return this._results.getItemAt(this.selectedResultIndex) as UITestVO;
+ }
+
+ private var _selectedResultIndex:int = -1;
+
+ [Bindable("change")]
+ public function get selectedResultIndex():int
+ {
+ return this._selectedResultIndex;
+ }
+
+ public function set selectedResultIndex(value:int):void
+ {
+ this._selectedResultIndex = value;
+ this.dispatchEvent(new Event("change"));
+ }
+
+ [Bindable]
+ public var resultTypes:Array = [RESULT_TYPE_ALL, RESULT_TYPE_FAILED, RESULT_TYPE_PASSED, RESULT_TYPE_IGNORED];
+ }
+}
\ No newline at end of file
diff --git a/frameworks/projects/RoyaleUnitUI/src/org/apache/royale/html/test/models/UITestVO.as b/frameworks/projects/RoyaleUnitUI/src/org/apache/royale/html/test/models/UITestVO.as
new file mode 100644
index 0000000..362262b
--- /dev/null
+++ b/frameworks/projects/RoyaleUnitUI/src/org/apache/royale/html/test/models/UITestVO.as
@@ -0,0 +1,48 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.royale.html.test.models
+{
+ import org.apache.royale.test.runners.notification.Failure;
+
+ [ExcludeClass]
+ [Bindable]
+ /**
+ * @private
+ */
+ public class UITestVO
+ {
+ public function UITestVO(description:String)
+ {
+ this.description = description;
+
+ var index:int = description.lastIndexOf(".");
+ testCaseName = description.substr(0, index);
+ functionName = description.substr(index + 1);
+ }
+
+ public var description:String;
+
+ public var functionName:String;
+ public var testCaseName:String;
+
+ public var active:Boolean = true;
+ public var ignored:Boolean = false;
+ public var failure:Failure;
+ }
+}
\ No newline at end of file