├── tests ├── nunit.runner.tests.iOS │ ├── iTunesArtwork │ ├── iTunesArtwork@2x │ ├── Resources │ │ ├── Default.png │ │ ├── Icon-76.png │ │ ├── Default@2x.png │ │ ├── Icon-60@2x.png │ │ ├── Icon-60@3x.png │ │ ├── Icon-76@2x.png │ │ ├── Icon-Small.png │ │ ├── Icon-Small-40.png │ │ ├── Icon-Small@2x.png │ │ ├── Icon-Small@3x.png │ │ ├── Default-568h@2x.png │ │ ├── Default-Portrait.png │ │ ├── Icon-Small-40@2x.png │ │ ├── Icon-Small-40@3x.png │ │ ├── Default-Portrait@2x.png │ │ └── LaunchScreen.storyboard │ ├── Entitlements.plist │ ├── Properties │ │ └── AssemblyInfo.cs │ ├── Main.cs │ ├── Info.plist │ ├── AppDelegate.cs │ └── nunit.runner.tests.iOS.csproj ├── nunit.runner.tests.uwp │ ├── Assets │ │ ├── StoreLogo.png │ │ ├── LockScreenLogo.scale-200.png │ │ ├── SplashScreen.scale-200.png │ │ ├── Square44x44Logo.scale-200.png │ │ ├── Wide310x150Logo.scale-200.png │ │ ├── Square150x150Logo.scale-200.png │ │ └── Square44x44Logo.targetsize-24_altform-unplated.png │ ├── App.xaml │ ├── MainPage.xaml │ ├── Properties │ │ ├── Default.rd.xml │ │ └── AssemblyInfo.cs │ ├── Package.appxmanifest │ ├── MainPage.xaml.cs │ ├── App.xaml.cs │ └── nunit.runner.tests.uwp.csproj ├── nunit.runner.tests.Droid │ ├── Resources │ │ ├── drawable │ │ │ └── icon.png │ │ ├── drawable-hdpi │ │ │ └── icon.png │ │ ├── drawable-xhdpi │ │ │ └── icon.png │ │ ├── drawable-xxhdpi │ │ │ └── icon.png │ │ └── AboutResources.txt │ ├── Properties │ │ ├── AndroidManifest.xml │ │ └── AssemblyInfo.cs │ ├── Assets │ │ └── AboutAssets.txt │ ├── MainActivity.cs │ └── nunit.runner.tests.Droid.csproj └── nunit.runner.tests │ ├── nunit.runner.tests.projitems │ ├── nunit.runner.tests.shproj │ ├── Properties │ └── AssemblyInfoCommon.cs │ ├── TestCaseSample.cs │ ├── AsyncTests.cs │ └── TestsSample.cs ├── tools └── packages.config ├── appveyor.yml ├── NuGet.config ├── .editorconfig ├── LICENSE.txt ├── src └── nunit.xamarin │ ├── App.xaml │ ├── nunit.xamarin.csproj │ ├── View │ ├── TestView.xaml.cs │ ├── ResultsView.xaml.cs │ ├── ResultsView.xaml │ ├── TestView.xaml │ ├── SummaryView.xaml.cs │ └── SummaryView.xaml │ ├── Messages │ └── ErrorMessage.cs │ ├── ViewModel │ ├── BaseViewModel.cs │ ├── ResultViewModel.cs │ ├── TestViewModel.cs │ ├── ResultsViewModel.cs │ └── SummaryViewModel.cs │ ├── Services │ ├── TestResultProcessor.cs │ ├── XmlFileProcessor.cs │ ├── TcpWriterProcessor.cs │ ├── TestOptions.cs │ ├── TcpWriterInfo.cs │ └── TcpWriter.cs │ ├── Helpers │ ├── TestRunResult.cs │ ├── TestPackage.cs │ └── ResultSummary.cs │ ├── Extensions │ └── XamarinExtensions.cs │ └── App.xaml.cs ├── CHANGES.md ├── README.md ├── .gitattributes ├── CODE_OF_CONDUCT.md ├── .gitignore ├── nunit.runner.sln.DotSettings └── nunit.xamarin.sln /tests/nunit.runner.tests.iOS/iTunesArtwork: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunit/nunit.xamarin/HEAD/tests/nunit.runner.tests.iOS/iTunesArtwork -------------------------------------------------------------------------------- /tools/packages.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /tests/nunit.runner.tests.iOS/iTunesArtwork@2x: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunit/nunit.xamarin/HEAD/tests/nunit.runner.tests.iOS/iTunesArtwork@2x -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | image: Visual Studio 2017 2 | 3 | build_script: 4 | - ps: .\build.ps1 -Target Appveyor 5 | 6 | # disable built-in tests. 7 | test: off -------------------------------------------------------------------------------- /tests/nunit.runner.tests.uwp/Assets/StoreLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunit/nunit.xamarin/HEAD/tests/nunit.runner.tests.uwp/Assets/StoreLogo.png -------------------------------------------------------------------------------- /tests/nunit.runner.tests.iOS/Resources/Default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunit/nunit.xamarin/HEAD/tests/nunit.runner.tests.iOS/Resources/Default.png -------------------------------------------------------------------------------- /tests/nunit.runner.tests.iOS/Resources/Icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunit/nunit.xamarin/HEAD/tests/nunit.runner.tests.iOS/Resources/Icon-76.png -------------------------------------------------------------------------------- /tests/nunit.runner.tests.iOS/Resources/Default@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunit/nunit.xamarin/HEAD/tests/nunit.runner.tests.iOS/Resources/Default@2x.png -------------------------------------------------------------------------------- /tests/nunit.runner.tests.iOS/Resources/Icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunit/nunit.xamarin/HEAD/tests/nunit.runner.tests.iOS/Resources/Icon-60@2x.png -------------------------------------------------------------------------------- /tests/nunit.runner.tests.iOS/Resources/Icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunit/nunit.xamarin/HEAD/tests/nunit.runner.tests.iOS/Resources/Icon-60@3x.png -------------------------------------------------------------------------------- /tests/nunit.runner.tests.iOS/Resources/Icon-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunit/nunit.xamarin/HEAD/tests/nunit.runner.tests.iOS/Resources/Icon-76@2x.png -------------------------------------------------------------------------------- /tests/nunit.runner.tests.iOS/Resources/Icon-Small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunit/nunit.xamarin/HEAD/tests/nunit.runner.tests.iOS/Resources/Icon-Small.png -------------------------------------------------------------------------------- /tests/nunit.runner.tests.iOS/Resources/Icon-Small-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunit/nunit.xamarin/HEAD/tests/nunit.runner.tests.iOS/Resources/Icon-Small-40.png -------------------------------------------------------------------------------- /tests/nunit.runner.tests.iOS/Resources/Icon-Small@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunit/nunit.xamarin/HEAD/tests/nunit.runner.tests.iOS/Resources/Icon-Small@2x.png -------------------------------------------------------------------------------- /tests/nunit.runner.tests.iOS/Resources/Icon-Small@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunit/nunit.xamarin/HEAD/tests/nunit.runner.tests.iOS/Resources/Icon-Small@3x.png -------------------------------------------------------------------------------- /tests/nunit.runner.tests.Droid/Resources/drawable/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunit/nunit.xamarin/HEAD/tests/nunit.runner.tests.Droid/Resources/drawable/icon.png -------------------------------------------------------------------------------- /tests/nunit.runner.tests.iOS/Resources/Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunit/nunit.xamarin/HEAD/tests/nunit.runner.tests.iOS/Resources/Default-568h@2x.png -------------------------------------------------------------------------------- /tests/nunit.runner.tests.iOS/Resources/Default-Portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunit/nunit.xamarin/HEAD/tests/nunit.runner.tests.iOS/Resources/Default-Portrait.png -------------------------------------------------------------------------------- /tests/nunit.runner.tests.iOS/Resources/Icon-Small-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunit/nunit.xamarin/HEAD/tests/nunit.runner.tests.iOS/Resources/Icon-Small-40@2x.png -------------------------------------------------------------------------------- /tests/nunit.runner.tests.iOS/Resources/Icon-Small-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunit/nunit.xamarin/HEAD/tests/nunit.runner.tests.iOS/Resources/Icon-Small-40@3x.png -------------------------------------------------------------------------------- /tests/nunit.runner.tests.Droid/Resources/drawable-hdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunit/nunit.xamarin/HEAD/tests/nunit.runner.tests.Droid/Resources/drawable-hdpi/icon.png -------------------------------------------------------------------------------- /tests/nunit.runner.tests.Droid/Resources/drawable-xhdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunit/nunit.xamarin/HEAD/tests/nunit.runner.tests.Droid/Resources/drawable-xhdpi/icon.png -------------------------------------------------------------------------------- /tests/nunit.runner.tests.iOS/Resources/Default-Portrait@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunit/nunit.xamarin/HEAD/tests/nunit.runner.tests.iOS/Resources/Default-Portrait@2x.png -------------------------------------------------------------------------------- /tests/nunit.runner.tests.uwp/Assets/LockScreenLogo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunit/nunit.xamarin/HEAD/tests/nunit.runner.tests.uwp/Assets/LockScreenLogo.scale-200.png -------------------------------------------------------------------------------- /tests/nunit.runner.tests.uwp/Assets/SplashScreen.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunit/nunit.xamarin/HEAD/tests/nunit.runner.tests.uwp/Assets/SplashScreen.scale-200.png -------------------------------------------------------------------------------- /tests/nunit.runner.tests.Droid/Resources/drawable-xxhdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunit/nunit.xamarin/HEAD/tests/nunit.runner.tests.Droid/Resources/drawable-xxhdpi/icon.png -------------------------------------------------------------------------------- /tests/nunit.runner.tests.uwp/Assets/Square44x44Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunit/nunit.xamarin/HEAD/tests/nunit.runner.tests.uwp/Assets/Square44x44Logo.scale-200.png -------------------------------------------------------------------------------- /tests/nunit.runner.tests.uwp/Assets/Wide310x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunit/nunit.xamarin/HEAD/tests/nunit.runner.tests.uwp/Assets/Wide310x150Logo.scale-200.png -------------------------------------------------------------------------------- /tests/nunit.runner.tests.uwp/Assets/Square150x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunit/nunit.xamarin/HEAD/tests/nunit.runner.tests.uwp/Assets/Square150x150Logo.scale-200.png -------------------------------------------------------------------------------- /tests/nunit.runner.tests.uwp/Assets/Square44x44Logo.targetsize-24_altform-unplated.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunit/nunit.xamarin/HEAD/tests/nunit.runner.tests.uwp/Assets/Square44x44Logo.targetsize-24_altform-unplated.png -------------------------------------------------------------------------------- /tests/nunit.runner.tests.iOS/Entitlements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /tests/nunit.runner.tests.uwp/App.xaml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /NuGet.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /tests/nunit.runner.tests.Droid/Properties/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and 2 | # maintain consistent coding styles between 3 | # different editors and IDEs 4 | 5 | # http://EditorConfig.org 6 | 7 | # top-most EditorConfig file 8 | root = true 9 | 10 | [*] 11 | indent_style = space 12 | indent_size = 4 13 | 14 | [*.csproj] 15 | indent_style = space 16 | indent_size = 2 17 | 18 | [*.vcxproj] 19 | indent_style = space 20 | indent_size = 2 21 | 22 | [*.config] 23 | indent_style = space 24 | indent_size = 2 25 | 26 | [NUnit.proj] 27 | indent_style = tab 28 | indent_size = 2 -------------------------------------------------------------------------------- /tests/nunit.runner.tests.uwp/MainPage.xaml: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /tests/nunit.runner.tests.Droid/Assets/AboutAssets.txt: -------------------------------------------------------------------------------- 1 | Any raw assets you want to be deployed with your application can be placed in 2 | this directory (and child directories) and given a Build Action of "AndroidAsset". 3 | 4 | These files will be deployed with you package and will be accessible using Android's 5 | AssetManager, like this: 6 | 7 | public class ReadAsset : Activity 8 | { 9 | protected override void OnCreate (Bundle bundle) 10 | { 11 | base.OnCreate (bundle); 12 | 13 | InputStream input = Assets.Open ("my_asset.txt"); 14 | } 15 | } 16 | 17 | Additionally, some Android functions will automatically load asset files: 18 | 19 | Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf"); 20 | -------------------------------------------------------------------------------- /tests/nunit.runner.tests/nunit.runner.tests.projitems: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | $(MSBuildAllProjects);$(MSBuildThisFileFullPath) 5 | true 6 | AF293652-BAA0-4813-B4F3-2D5A2CDDE0B4 7 | 8 | 9 | NUnit.Runner.Tests 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /tests/nunit.runner.tests/nunit.runner.tests.shproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | AF293652-BAA0-4813-B4F3-2D5A2CDDE0B4 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2017 NUnit Project 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | 21 | -------------------------------------------------------------------------------- /tests/nunit.runner.tests.uwp/Properties/Default.rd.xml: -------------------------------------------------------------------------------- 1 | 17 | 18 | 19 | 20 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /src/nunit.xamarin/App.xaml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 12 | 15 | 16 | 17 | 25 | 26 | 27 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /tests/nunit.runner.tests.iOS/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2015 CNUnit Project 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining 4 | // a copy of this software and associated documentation files (the 5 | // "Software"), to deal in the Software without restriction, including 6 | // without limitation the rights to use, copy, modify, merge, publish, 7 | // distribute, sublicense, and/or sell copies of the Software, and to 8 | // permit persons to whom the Software is furnished to do so, subject to 9 | // the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be 12 | // included in all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | // *********************************************************************** 22 | 23 | using System.Reflection; 24 | 25 | [assembly: AssemblyTitle("NUnit.Runner.Tests.iOS")] 26 | [assembly: AssemblyDescription("Unit Tests for NUnit Test Runner for iOS")] -------------------------------------------------------------------------------- /tests/nunit.runner.tests.Droid/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2018 NUnit Project 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining 4 | // a copy of this software and associated documentation files (the 5 | // "Software"), to deal in the Software without restriction, including 6 | // without limitation the rights to use, copy, modify, merge, publish, 7 | // distribute, sublicense, and/or sell copies of the Software, and to 8 | // permit persons to whom the Software is furnished to do so, subject to 9 | // the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be 12 | // included in all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | // *********************************************************************** 22 | 23 | using System.Reflection; 24 | 25 | [assembly: AssemblyTitle("NUnit.Runner.Tests.Droid")] 26 | [assembly: AssemblyDescription("Unit Tests for NUnit Test Runner for Android")] -------------------------------------------------------------------------------- /tests/nunit.runner.tests.uwp/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2015 CNUnit Project 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining 4 | // a copy of this software and associated documentation files (the 5 | // "Software"), to deal in the Software without restriction, including 6 | // without limitation the rights to use, copy, modify, merge, publish, 7 | // distribute, sublicense, and/or sell copies of the Software, and to 8 | // permit persons to whom the Software is furnished to do so, subject to 9 | // the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be 12 | // included in all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | // *********************************************************************** 22 | 23 | using System.Reflection; 24 | 25 | [assembly: AssemblyTitle("NUnit.Runner.Tests.UWP")] 26 | [assembly: AssemblyDescription("Unit Tests for NUnit Test Runner for Universal Windows")] -------------------------------------------------------------------------------- /CHANGES.md: -------------------------------------------------------------------------------- 1 | ### NUnit Xamarin Runner 3.6.1 - March 14, 2017 2 | 3 | This release includes new functionality to write and retrieve a TestResult xml file, via either a TCP port or specified file path. Additional changes are also included to improve intergration with CI systems. 4 | 5 | Windows Phone 8.1 support has been removed in this release. 6 | 7 | #### Issues Resolved 8 | 9 | * 17 Add a TcpListener 10 | * 24 Create a Test Results file 11 | * 51 Update to NUnit 3.5 12 | * 53 Update the README and docs 13 | * 57 String resource Hello without id in Droid Runner project 14 | * 59 Enable adding multiple assemblies to test 15 | * 60 Added TestOption to change xml result file location 16 | * 62 Get AppVeyor build working 17 | * 64 Remove support for Win Phone 8.1 18 | * 65 Update library versions 19 | * 66 Remove Text/UI references to NUnit 3.0 20 | * 70 Make the Icon Larger 21 | * 74 Document framework version dependency of runner 22 | * 84 Allow app to be terminated automatically after running the tests 23 | * 85 Update to NUnit 3.6.1 24 | * 86 Include UWP test runner in CI 25 | * 91 Added a null check in the TestOptions get-method 26 | 27 | ### NUnit Xamarin Runner 3.0.1 - December 3, 2015 28 | 29 | This release updates the test runner to use the new 3.0.1 NUnit Framework which fixes issues with Async tests on Windows 10 UWP. 30 | 31 | ### NUnit Xamarin Runner 3.0.0 - November 18, 2015 32 | 33 | This is the first release of the NUnit Xamarin Runners supporting Android, iOS, Windows Phone 8.1 and Windows 10 Universal Apps. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # NUnit 3 Xamarin Runners 2 | 3 | [![Build status](https://ci.appveyor.com/api/projects/status/4972j2pn4mqs7j8n/branch/master?svg=true)](https://ci.appveyor.com/project/CharliePoole/nunit-xamarin/branch/master)[![NuGet Version and Downloads count](https://buildstats.info/nuget/nunit.xamarin?includePreReleases=true)](https://www.nuget.org/packages/nunit.xamarin) 4 | 5 | [![Follow NUnit](https://img.shields.io/twitter/follow/nunit.svg?style=social)](https://twitter.com/nunit) 6 | 7 | NUnit test runners for Xamarin and mobile devices. Check out the guides below to get started, or install the [NUnit Visual Studio Templates](https://marketplace.visualstudio.com/items?itemName=NUnitDevelopers.NUnitTemplatesforVisualStudio) extension to create a template project. See [Testing Xamarin Projects using NUnit 3](http://www.alteridem.net/2015/12/21/testing-xamarin-projects-using-nunit-3/) for an handy overview. 8 | 9 | - [Documentation](https://github.com/nunit/docs/wiki/NUnit-Xamarin-Runners) 10 | - [Getting Started in Visual Studio](https://github.com/nunit/docs/wiki/Getting-Started-in-Visual-Studio) 11 | - [Getting Started in Visual Studio for Mac](https://github.com/nunit/docs/wiki/Getting-Started-in-Visual-Studio-for-Mac) 12 | - [NUnit Templates for Visual Studio](https://github.com/nunit/nunit-vs-templates) 13 | 14 | ## Contributing 15 | We love pull requests! All NUnit projects are built and maintained entirely by the community, contributions of any kind are welcome. Not sure where to start? Have a look at our [Contributor's guide](https://github.com/nunit/nunit/blob/master/CONTRIBUTING.md). 16 | 17 | Adding something new? We suggest posting an issue first, to run your idea by the team. -------------------------------------------------------------------------------- /src/nunit.xamarin/nunit.xamarin.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | netstandard2.0 5 | NUnit 6 | NUnit 3 Xamarin Runner 7 | Copyright (C) 2018, Rob Prouse 8 | 3.10.1 9 | 10 | 11 | nunit.xamarin 12 | NUnit 3 Xamarin Runner 13 | Rob Prouse 14 | https://raw.githubusercontent.com/nunit/nunit.xamarin/master/LICENSE.txt 15 | https://cdn.rawgit.com/nunit/resources/master/images/icon/nunit_256.png 16 | https://github.com/nunit/nunit.xamarin 17 | https://github.com/nunit/nunit.xamarin 18 | git 19 | nunit xamarin android ios monoandroid monotouch tdd unit test testing 20 | 21 | Adds support for running NUnit 3 unit tests on Xamarin 22 | 23 | Supported Xamarin platforms: 24 | - Android 25 | - iOS 26 | - Windows 10 Universal Apps 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | *.xaml 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /tests/nunit.runner.tests.uwp/Package.appxmanifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | nunit.runner.tests.uwp 7 | Rob Prouse 8 | Assets\StoreLogo.png 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/nunit.xamarin/View/TestView.xaml.cs: -------------------------------------------------------------------------------- 1 | // *********************************************************************** 2 | // Copyright (c) 2015 NUnit Project 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining 5 | // a copy of this software and associated documentation files (the 6 | // "Software"), to deal in the Software without restriction, including 7 | // without limitation the rights to use, copy, modify, merge, publish, 8 | // distribute, sublicense, and/or sell copies of the Software, and to 9 | // permit persons to whom the Software is furnished to do so, subject to 10 | // the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | // *********************************************************************** 23 | 24 | using NUnit.Runner.ViewModel; 25 | using Xamarin.Forms; 26 | 27 | namespace NUnit.Runner.View 28 | { 29 | /// 30 | /// Xamarin.Forms view of an individual test result 31 | /// 32 | public partial class TestView : ContentPage 33 | { 34 | internal TestView(TestViewModel model) 35 | { 36 | BindingContext = model; 37 | InitializeComponent(); 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /tests/nunit.runner.tests.iOS/Main.cs: -------------------------------------------------------------------------------- 1 | // *********************************************************************** 2 | // Copyright (c) 2015 NUnit Project 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining 5 | // a copy of this software and associated documentation files (the 6 | // "Software"), to deal in the Software without restriction, including 7 | // without limitation the rights to use, copy, modify, merge, publish, 8 | // distribute, sublicense, and/or sell copies of the Software, and to 9 | // permit persons to whom the Software is furnished to do so, subject to 10 | // the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | // *********************************************************************** 23 | 24 | using UIKit; 25 | 26 | namespace NUnit.Runner.Tests 27 | { 28 | public class Application 29 | { 30 | // This is the main entry point of the application. 31 | static void Main(string[] args) 32 | { 33 | // if you want to use a different Application Delegate class from "AppDelegate" 34 | // you can specify it here. 35 | UIApplication.Main(args, null, "AppDelegate"); 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /tests/nunit.runner.tests.iOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UIDeviceFamily 6 | 7 | 1 8 | 2 9 | 10 | UISupportedInterfaceOrientations 11 | 12 | UIInterfaceOrientationPortrait 13 | UIInterfaceOrientationLandscapeLeft 14 | UIInterfaceOrientationLandscapeRight 15 | 16 | UISupportedInterfaceOrientations~ipad 17 | 18 | UIInterfaceOrientationPortrait 19 | UIInterfaceOrientationPortraitUpsideDown 20 | UIInterfaceOrientationLandscapeLeft 21 | UIInterfaceOrientationLandscapeRight 22 | 23 | MinimumOSVersion 24 | 7.0 25 | CFBundleDisplayName 26 | nunit.runner 27 | CFBundleIdentifier 28 | com.yourcompany.nunit.runner 29 | CFBundleVersion 30 | 1.0 31 | CFBundleIconFiles 32 | 33 | Icon-60@2x 34 | Icon-60@3x 35 | Icon-76 36 | Icon-76@2x 37 | Default 38 | Default@2x 39 | Default-568h@2x 40 | Default-Portrait 41 | Default-Portrait@2x 42 | Icon-Small-40 43 | Icon-Small-40@2x 44 | Icon-Small-40@3x 45 | Icon-Small 46 | Icon-Small@2x 47 | Icon-Small@3x 48 | 49 | UILaunchStoryboardName 50 | LaunchScreen 51 | CFBundleShortVersionString 52 | 53 | UIFileSharingEnabled 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /tests/nunit.runner.tests.Droid/Resources/AboutResources.txt: -------------------------------------------------------------------------------- 1 | Images, layout descriptions, binary blobs and string dictionaries can be included 2 | in your application as resource files. Various Android APIs are designed to 3 | operate on the resource IDs instead of dealing with images, strings or binary blobs 4 | directly. 5 | 6 | For example, a sample Android app that contains a user interface layout (main.xml), 7 | an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png) 8 | would keep its resources in the "Resources" directory of the application: 9 | 10 | Resources/ 11 | drawable-hdpi/ 12 | icon.png 13 | 14 | drawable-ldpi/ 15 | icon.png 16 | 17 | drawable-mdpi/ 18 | icon.png 19 | 20 | layout/ 21 | main.xml 22 | 23 | values/ 24 | strings.xml 25 | 26 | In order to get the build system to recognize Android resources, set the build action to 27 | "AndroidResource". The native Android APIs do not operate directly with filenames, but 28 | instead operate on resource IDs. When you compile an Android application that uses resources, 29 | the build system will package the resources for distribution and generate a class called 30 | "Resource" that contains the tokens for each one of the resources included. For example, 31 | for the above Resources layout, this is what the Resource class would expose: 32 | 33 | public class Resource { 34 | public class drawable { 35 | public const int icon = 0x123; 36 | } 37 | 38 | public class layout { 39 | public const int main = 0x456; 40 | } 41 | 42 | public class strings { 43 | public const int first_string = 0xabc; 44 | public const int second_string = 0xbcd; 45 | } 46 | } 47 | 48 | You would then use R.drawable.icon to reference the drawable/icon.png file, or Resource.layout.main 49 | to reference the layout/main.xml file, or Resource.strings.first_string to reference the first 50 | string in the dictionary file values/strings.xml. 51 | -------------------------------------------------------------------------------- /src/nunit.xamarin/Messages/ErrorMessage.cs: -------------------------------------------------------------------------------- 1 | // *********************************************************************** 2 | // Copyright (c) 2017 NUnit Project 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining 5 | // a copy of this software and associated documentation files (the 6 | // "Software"), to deal in the Software without restriction, including 7 | // without limitation the rights to use, copy, modify, merge, publish, 8 | // distribute, sublicense, and/or sell copies of the Software, and to 9 | // permit persons to whom the Software is furnished to do so, subject to 10 | // the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | // *********************************************************************** 23 | 24 | namespace NUnit.Runner.Messages 25 | { 26 | /// 27 | /// Represents an error message 28 | /// 29 | public class ErrorMessage 30 | { 31 | /// 32 | /// The name of this message 33 | /// 34 | public const string Name = nameof(ErrorMessage); 35 | 36 | /// 37 | /// Constructs an with a message 38 | /// 39 | /// 40 | public ErrorMessage(string message) 41 | { 42 | Message = message; 43 | } 44 | 45 | /// 46 | /// The error message 47 | /// 48 | public string Message { get; set; } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/nunit.xamarin/View/ResultsView.xaml.cs: -------------------------------------------------------------------------------- 1 | // *********************************************************************** 2 | // Copyright (c) 2015 NUnit Project 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining 5 | // a copy of this software and associated documentation files (the 6 | // "Software"), to deal in the Software without restriction, including 7 | // without limitation the rights to use, copy, modify, merge, publish, 8 | // distribute, sublicense, and/or sell copies of the Software, and to 9 | // permit persons to whom the Software is furnished to do so, subject to 10 | // the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | // *********************************************************************** 23 | 24 | using NUnit.Runner.ViewModel; 25 | using Xamarin.Forms; 26 | 27 | namespace NUnit.Runner.View 28 | { 29 | /// 30 | /// Xamarin.Forms view of a list of test results 31 | /// 32 | public partial class ResultsView : ContentPage 33 | { 34 | internal ResultsView (ResultsViewModel model) 35 | { 36 | model.Navigation = Navigation; 37 | BindingContext = model; 38 | InitializeComponent(); 39 | } 40 | 41 | internal async void ViewTest(object sender, SelectedItemChangedEventArgs e) 42 | { 43 | var result = e.SelectedItem as ResultViewModel; 44 | if (result != null) 45 | await Navigation.PushAsync(new TestView(new TestViewModel(result.TestResult))); 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/nunit.xamarin/View/ResultsView.xaml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 12 | 17 | 18 | 19 | 20 | 21 | 22 | 25 | 26 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /src/nunit.xamarin/ViewModel/BaseViewModel.cs: -------------------------------------------------------------------------------- 1 | // *********************************************************************** 2 | // Copyright (c) 2015 NUnit Project 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining 5 | // a copy of this software and associated documentation files (the 6 | // "Software"), to deal in the Software without restriction, including 7 | // without limitation the rights to use, copy, modify, merge, publish, 8 | // distribute, sublicense, and/or sell copies of the Software, and to 9 | // permit persons to whom the Software is furnished to do so, subject to 10 | // the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | // *********************************************************************** 23 | 24 | using System.ComponentModel; 25 | using System.Runtime.CompilerServices; 26 | using NUnit.Runner.Annotations; 27 | using Xamarin.Forms; 28 | 29 | namespace NUnit.Runner.ViewModel 30 | { 31 | class BaseViewModel : INotifyPropertyChanged 32 | { 33 | /// 34 | /// So that we can navigate from within the view model 35 | /// 36 | public INavigation Navigation { get; set; } 37 | 38 | public event PropertyChangedEventHandler PropertyChanged; 39 | 40 | [NotifyPropertyChangedInvocator] 41 | protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 42 | { 43 | PropertyChangedEventHandler handler = PropertyChanged; 44 | if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 45 | } 46 | } 47 | } -------------------------------------------------------------------------------- /src/nunit.xamarin/Services/TestResultProcessor.cs: -------------------------------------------------------------------------------- 1 | // *********************************************************************** 2 | // Copyright (c) 2016 NUnit Project 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining 5 | // a copy of this software and associated documentation files (the 6 | // "Software"), to deal in the Software without restriction, including 7 | // without limitation the rights to use, copy, modify, merge, publish, 8 | // distribute, sublicense, and/or sell copies of the Software, and to 9 | // permit persons to whom the Software is furnished to do so, subject to 10 | // the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | // *********************************************************************** 23 | 24 | using System.Threading.Tasks; 25 | using NUnit.Runner.Helpers; 26 | 27 | namespace NUnit.Runner.Services 28 | { 29 | abstract class TestResultProcessor 30 | { 31 | protected TestResultProcessor(TestOptions options) 32 | { 33 | Options = options; 34 | } 35 | 36 | protected TestOptions Options { get; private set; } 37 | 38 | protected TestResultProcessor Successor { get; private set; } 39 | 40 | public abstract Task Process(ResultSummary testResult); 41 | 42 | public static TestResultProcessor BuildChainOfResponsability(TestOptions options) 43 | { 44 | var tcpWriter = new TcpWriterProcessor(options); 45 | var xmlFileWriter = new XmlFileProcessor(options); 46 | 47 | tcpWriter.Successor = xmlFileWriter; 48 | return tcpWriter; 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /tests/nunit.runner.tests/Properties/AssemblyInfoCommon.cs: -------------------------------------------------------------------------------- 1 | // *********************b************************************************** 2 | // Copyright (c) 2018 NUnit Project 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining 5 | // a copy of this software and associated documentation files (the 6 | // "Software"), to deal in the Software without restriction, including 7 | // without limitation the rights to use, copy, modify, merge, publish, 8 | // distribute, sublicense, and/or sell copies of the Software, and to 9 | // permit persons to whom the Software is furnished to do so, subject to 10 | // the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | // *********************************************************************** 23 | 24 | using System.Reflection; 25 | using System.Runtime.InteropServices; 26 | 27 | [assembly: AssemblyProduct("NUnit 3")] 28 | [assembly: AssemblyCopyright("Copyright (C) 2018 NUnit Project")] 29 | [assembly: AssemblyTrademark("NUnit is a trademark of NUnit Software")] 30 | [assembly: AssemblyCulture("")] 31 | 32 | [assembly: AssemblyVersion("3.10.1")] 33 | [assembly: AssemblyFileVersion("3.10.1.0")] 34 | 35 | [assembly: ComVisible(false)] 36 | 37 | 38 | #if DEBUG 39 | #if __IOS__ 40 | [assembly: AssemblyConfiguration("iOS Debug")] 41 | #elif __DROID__ 42 | [assembly: AssemblyConfiguration("Android Debug")] 43 | #else 44 | [assembly: AssemblyConfiguration("Debug")] 45 | #endif 46 | #else 47 | #if __IOS__ 48 | [assembly: AssemblyConfiguration("iOS 4.5")] 49 | #elif __DROID__ 50 | [assembly: AssemblyConfiguration("Android 4.0")] 51 | #else 52 | [assembly: AssemblyConfiguration("")] 53 | #endif 54 | #endif -------------------------------------------------------------------------------- /src/nunit.xamarin/Helpers/TestRunResult.cs: -------------------------------------------------------------------------------- 1 | // *********************************************************************** 2 | // Copyright (c) 2017 NUnit Project 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining 5 | // a copy of this software and associated documentation files (the 6 | // "Software"), to deal in the Software without restriction, including 7 | // without limitation the rights to use, copy, modify, merge, publish, 8 | // distribute, sublicense, and/or sell copies of the Software, and to 9 | // permit persons to whom the Software is furnished to do so, subject to 10 | // the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | // *********************************************************************** 23 | 24 | using System; 25 | using System.Collections.Generic; 26 | using NUnit.Framework.Interfaces; 27 | 28 | namespace NUnit.Runner.Helpers 29 | { 30 | /// 31 | /// Contains all results from all tests in a 32 | /// 33 | internal class TestRunResult 34 | { 35 | private readonly List _results = new List(); 36 | 37 | public DateTime StartTime { get; private set; } 38 | public DateTime EndTime { get; private set; } 39 | 40 | public TestRunResult() 41 | { 42 | StartTime = DateTime.Now; 43 | } 44 | 45 | public void AddResult(ITestResult result) 46 | { 47 | _results.Add(result); 48 | } 49 | 50 | public void CompleteTestRun() 51 | { 52 | EndTime = DateTime.Now; 53 | } 54 | 55 | public IReadOnlyCollection TestResults => _results; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/nunit.xamarin/ViewModel/ResultViewModel.cs: -------------------------------------------------------------------------------- 1 | // *********************************************************************** 2 | // Copyright (c) 2015 NUnit Project 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining 5 | // a copy of this software and associated documentation files (the 6 | // "Software"), to deal in the Software without restriction, including 7 | // without limitation the rights to use, copy, modify, merge, publish, 8 | // distribute, sublicense, and/or sell copies of the Software, and to 9 | // permit persons to whom the Software is furnished to do so, subject to 10 | // the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | // *********************************************************************** 23 | 24 | using NUnit.Framework.Interfaces; 25 | using NUnit.Runner.Extensions; 26 | using Xamarin.Forms; 27 | 28 | namespace NUnit.Runner.ViewModel 29 | { 30 | internal class ResultViewModel 31 | { 32 | public ResultViewModel(ITestResult result) 33 | { 34 | TestResult = result; 35 | Result = result.ResultState.Status.ToString().ToUpperInvariant(); 36 | Name = result.Name; 37 | Parent = result.Test.Parent.FullName; 38 | Message = result.Message; 39 | } 40 | 41 | public ITestResult TestResult { get; private set; } 42 | public string Result { get; set; } 43 | public string Name { get; private set; } 44 | public string Parent { get; private set; } 45 | public string Message { get; private set; } 46 | 47 | /// 48 | /// Gets the color for this result. 49 | /// 50 | public Color Color 51 | { 52 | get { return TestResult.ResultState.Color(); } 53 | } 54 | } 55 | } -------------------------------------------------------------------------------- /src/nunit.xamarin/View/TestView.xaml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 13 | 14 | 39 | 40 | -------------------------------------------------------------------------------- /tests/nunit.runner.tests/TestCaseSample.cs: -------------------------------------------------------------------------------- 1 | // *********************************************************************** 2 | // Copyright (c) 2015 NUnit Project 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining 5 | // a copy of this software and associated documentation files (the 6 | // "Software"), to deal in the Software without restriction, including 7 | // without limitation the rights to use, copy, modify, merge, publish, 8 | // distribute, sublicense, and/or sell copies of the Software, and to 9 | // permit persons to whom the Software is furnished to do so, subject to 10 | // the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | // *********************************************************************** 23 | 24 | using NUnit.Framework; 25 | 26 | namespace NUnit.Runner.Tests 27 | { 28 | [TestFixture] 29 | public class TestCaseSample 30 | { 31 | [TestCase(1, 1, ExpectedResult = 2)] 32 | [TestCase(10, 10, ExpectedResult = 20)] 33 | [TestCase(12, 13, ExpectedResult = 24)] // Deliberate failure 34 | public int TestAddWithResult(int x, int y) 35 | { 36 | return x + y; 37 | } 38 | 39 | [TestCase(1, 1, 2)] 40 | [TestCase(10, 10, 20)] 41 | [TestCase(12, 13, 24)] // Deliberate failure 42 | public void TestAddWithExpected(int x, int y, int expected) 43 | { 44 | Assert.That(x + y, Is.EqualTo(expected)); 45 | } 46 | 47 | [Test] 48 | public void TestPassedInParameter() 49 | { 50 | var val = TestContext.Parameters.Get("Parameter"); 51 | TestContext.WriteLine("The passed-in value associated with 'Parameter' is: {0}", val?? "null"); 52 | Assert.True(val == null || val == "Value"); 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/nunit.xamarin/View/SummaryView.xaml.cs: -------------------------------------------------------------------------------- 1 | // *********************************************************************** 2 | // Copyright (c) 2015 NUnit Project 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining 5 | // a copy of this software and associated documentation files (the 6 | // "Software"), to deal in the Software without restriction, including 7 | // without limitation the rights to use, copy, modify, merge, publish, 8 | // distribute, sublicense, and/or sell copies of the Software, and to 9 | // permit persons to whom the Software is furnished to do so, subject to 10 | // the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | // *********************************************************************** 23 | 24 | using NUnit.Runner.Messages; 25 | using NUnit.Runner.ViewModel; 26 | using Xamarin.Forms; 27 | 28 | namespace NUnit.Runner.View 29 | { 30 | /// 31 | /// The main Xamarin.Forms view of the application 32 | /// 33 | public partial class SummaryView : ContentPage 34 | { 35 | SummaryViewModel _model; 36 | 37 | internal SummaryView (SummaryViewModel model) 38 | { 39 | _model = model; 40 | _model.Navigation = Navigation; 41 | BindingContext = _model; 42 | InitializeComponent(); 43 | 44 | MessagingCenter.Subscribe(this, ErrorMessage.Name, error => { 45 | Device.BeginInvokeOnMainThread(async () => await DisplayAlert("Error", error.Message, "OK")); 46 | }); 47 | } 48 | 49 | /// 50 | /// Called when the view is appearing 51 | /// 52 | protected override void OnAppearing() 53 | { 54 | base.OnAppearing(); 55 | _model.OnAppearing(); 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /tests/nunit.runner.tests/AsyncTests.cs: -------------------------------------------------------------------------------- 1 | // *********************************************************************** 2 | // Copyright (c) 2015 NUnit Project 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining 5 | // a copy of this software and associated documentation files (the 6 | // "Software"), to deal in the Software without restriction, including 7 | // without limitation the rights to use, copy, modify, merge, publish, 8 | // distribute, sublicense, and/or sell copies of the Software, and to 9 | // permit persons to whom the Software is furnished to do so, subject to 10 | // the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | // *********************************************************************** 23 | 24 | using NUnit.Framework; 25 | using System.Threading.Tasks; 26 | 27 | namespace NUnit.Runner.Tests 28 | { 29 | [TestFixture] 30 | public class AsyncTests 31 | { 32 | [Test] 33 | public async Task TestAsyncMethodWithoutReturn() 34 | { 35 | await AsyncMethodWithoutReturn(); 36 | Assert.Pass(); 37 | } 38 | 39 | [Test] 40 | public async Task TestAsyncMethodWithReturnValueIndirectly() 41 | { 42 | bool actual = await AsyncMethodWithReturnValue(); 43 | Assert.That(actual, Is.True); 44 | } 45 | 46 | [Test] 47 | public void TestAsyncMethodWithReturnValueDirectly() 48 | { 49 | Assert.That(async () => await AsyncMethodWithReturnValue(), Is.True); 50 | } 51 | 52 | public async Task AsyncMethodWithoutReturn() 53 | { 54 | await Task.FromResult(null); 55 | } 56 | 57 | public async Task AsyncMethodWithReturnValue() 58 | { 59 | return await Task.FromResult(true); 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/nunit.xamarin/Extensions/XamarinExtensions.cs: -------------------------------------------------------------------------------- 1 | // *********************************************************************** 2 | // Copyright (c) 2017 NUnit Project 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining 5 | // a copy of this software and associated documentation files (the 6 | // "Software"), to deal in the Software without restriction, including 7 | // without limitation the rights to use, copy, modify, merge, publish, 8 | // distribute, sublicense, and/or sell copies of the Software, and to 9 | // permit persons to whom the Software is furnished to do so, subject to 10 | // the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | // *********************************************************************** 23 | 24 | using NUnit.Framework.Interfaces; 25 | using Xamarin.Forms; 26 | 27 | namespace NUnit.Runner.Extensions 28 | { 29 | internal static class XamarinExtensions 30 | { 31 | /// 32 | /// Gets the color to display for the test status 33 | /// 34 | /// 35 | /// 36 | public static Color Color(this ResultState result) 37 | { 38 | switch (result.Status) 39 | { 40 | case TestStatus.Passed: 41 | return Xamarin.Forms.Color.Green; 42 | case TestStatus.Skipped: 43 | return Xamarin.Forms.Color.FromRgb(206, 172, 0); // Dark Yellow 44 | case TestStatus.Failed: 45 | if (result == ResultState.Failure) 46 | return Xamarin.Forms.Color.Red; 47 | if (result == ResultState.NotRunnable) 48 | return Xamarin.Forms.Color.FromRgb(255, 106, 0); // Orange 49 | 50 | return Xamarin.Forms.Color.FromRgb(170, 0, 0); // Dark Red 51 | 52 | case TestStatus.Inconclusive: 53 | default: 54 | return Xamarin.Forms.Color.Gray; 55 | } 56 | } 57 | } 58 | } -------------------------------------------------------------------------------- /tests/nunit.runner.tests.iOS/Resources/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /tests/nunit.runner.tests/TestsSample.cs: -------------------------------------------------------------------------------- 1 | // *********************************************************************** 2 | // Copyright (c) 2015 NUnit Project 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining 5 | // a copy of this software and associated documentation files (the 6 | // "Software"), to deal in the Software without restriction, including 7 | // without limitation the rights to use, copy, modify, merge, publish, 8 | // distribute, sublicense, and/or sell copies of the Software, and to 9 | // permit persons to whom the Software is furnished to do so, subject to 10 | // the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | // *********************************************************************** 23 | 24 | using System; 25 | using NUnit.Framework; 26 | 27 | namespace NUnit.Runner.Tests 28 | { 29 | [TestFixture] 30 | [Author("Rob Prouse")] 31 | public class TestsSample 32 | { 33 | [SetUp] 34 | public void Setup() { } 35 | 36 | 37 | [TearDown] 38 | public void Tear() { } 39 | 40 | [Test] 41 | [Category("Passing")] 42 | public void Pass() 43 | { 44 | TestContext.WriteLine("Capture some output"); 45 | Assert.True(true); 46 | } 47 | 48 | [Test] 49 | [Category("Failing")] 50 | [Author("Code Monkey")] 51 | public void Fail() 52 | { 53 | Assert.False(true); 54 | } 55 | 56 | [Test] 57 | [Ignore("another time")] 58 | public void Ignore() 59 | { 60 | Assert.True(false); 61 | } 62 | 63 | [Test] 64 | [Explicit("This is only run on demand")] 65 | public void Explicit() 66 | { 67 | Assert.True(true); 68 | } 69 | 70 | [Test] 71 | public void Inconclusive() 72 | { 73 | Assert.Inconclusive("Inconclusive"); 74 | } 75 | 76 | [Test] 77 | public void Error() 78 | { 79 | TestContext.WriteLine("I am about to throw!!!"); 80 | throw new NotSupportedException("This method isn't ready yet"); 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /src/nunit.xamarin/Services/XmlFileProcessor.cs: -------------------------------------------------------------------------------- 1 | // *********************************************************************** 2 | // Copyright (c) 2016 NUnit Project 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining 5 | // a copy of this software and associated documentation files (the 6 | // "Software"), to deal in the Software without restriction, including 7 | // without limitation the rights to use, copy, modify, merge, publish, 8 | // distribute, sublicense, and/or sell copies of the Software, and to 9 | // permit persons to whom the Software is furnished to do so, subject to 10 | // the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | // *********************************************************************** 23 | 24 | using System; 25 | using System.Diagnostics; 26 | using System.IO; 27 | using System.Threading.Tasks; 28 | using NUnit.Runner.Helpers; 29 | 30 | namespace NUnit.Runner.Services 31 | { 32 | class XmlFileProcessor : TestResultProcessor 33 | { 34 | public XmlFileProcessor(TestOptions options) 35 | : base(options) { } 36 | 37 | public override async Task Process(ResultSummary result) 38 | { 39 | if (Options.CreateXmlResultFile == false) 40 | return; 41 | 42 | try 43 | { 44 | await WriteXmlResultFile(result).ConfigureAwait(false); 45 | } 46 | catch (Exception) 47 | { 48 | Debug.WriteLine("Fatal error while trying to write xml result file!"); 49 | throw; 50 | } 51 | 52 | if (Successor != null) 53 | { 54 | await Successor.Process(result).ConfigureAwait(false); 55 | } 56 | } 57 | 58 | async Task WriteXmlResultFile(ResultSummary result) 59 | { 60 | string outputFolderName = Path.GetDirectoryName(Options.ResultFilePath); 61 | 62 | Directory.CreateDirectory(outputFolderName); 63 | 64 | using (var resultFileStream = new StreamWriter(Options.ResultFilePath, false)) 65 | { 66 | var xml = result.GetTestXml().ToString(); 67 | await resultFileStream.WriteAsync(xml); 68 | } 69 | } 70 | } 71 | } -------------------------------------------------------------------------------- /src/nunit.xamarin/Services/TcpWriterProcessor.cs: -------------------------------------------------------------------------------- 1 | // *********************************************************************** 2 | // Copyright (c) 2016 NUnit Project 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining 5 | // a copy of this software and associated documentation files (the 6 | // "Software"), to deal in the Software without restriction, including 7 | // without limitation the rights to use, copy, modify, merge, publish, 8 | // distribute, sublicense, and/or sell copies of the Software, and to 9 | // permit persons to whom the Software is furnished to do so, subject to 10 | // the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | // *********************************************************************** 23 | 24 | using System; 25 | using System.Threading.Tasks; 26 | 27 | using NUnit.Framework.Interfaces; 28 | using Xamarin.Forms; 29 | using NUnit.Runner.Messages; 30 | using NUnit.Runner.Helpers; 31 | 32 | namespace NUnit.Runner.Services 33 | { 34 | class TcpWriterProcessor : TestResultProcessor 35 | { 36 | public TcpWriterProcessor(TestOptions options) 37 | : base(options) 38 | { 39 | } 40 | 41 | public override async Task Process(ResultSummary result) 42 | { 43 | if (Options.TcpWriterParameters != null) 44 | { 45 | try 46 | { 47 | await WriteResult(result); 48 | } 49 | catch (Exception exception) 50 | { 51 | string message = $"Fatal error while trying to send xml result by TCP to {Options.TcpWriterParameters}\n\n{exception.Message}\n\nIs your server running?"; 52 | MessagingCenter.Send(new ErrorMessage(message), ErrorMessage.Name); 53 | } 54 | } 55 | 56 | if (Successor != null) 57 | { 58 | await Successor.Process(result); 59 | } 60 | } 61 | 62 | private async Task WriteResult(ResultSummary testResult) 63 | { 64 | using (var tcpWriter = new TcpWriter(Options.TcpWriterParameters)) 65 | { 66 | await tcpWriter.Connect().ConfigureAwait(false); 67 | tcpWriter.Write(testResult.GetTestXml()); 68 | } 69 | } 70 | } 71 | } -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | 65 | 66 | ############################################################################### 67 | # Xamarin and NUnit Specific 68 | ############################################################################### 69 | *.DotSettings text eol=lf 70 | AndroidManifest.xml text eol=lf 71 | build.sh text eol=lf 72 | build.ps1 text eol=lf -------------------------------------------------------------------------------- /src/nunit.xamarin/App.xaml.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2015 CNUnit Project 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining 4 | // a copy of this software and associated documentation files (the 5 | // "Software"), to deal in the Software without restriction, including 6 | // without limitation the rights to use, copy, modify, merge, publish, 7 | // distribute, sublicense, and/or sell copies of the Software, and to 8 | // permit persons to whom the Software is furnished to do so, subject to 9 | // the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be 12 | // included in all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | // *********************************************************************** 22 | 23 | using System.Reflection; 24 | using System.Collections.Generic; 25 | using NUnit.Runner.Services; 26 | using NUnit.Runner.View; 27 | using NUnit.Runner.ViewModel; 28 | using Xamarin.Forms; 29 | 30 | namespace NUnit.Runner 31 | { 32 | /// 33 | /// The NUnit Xamarin test runner 34 | /// 35 | public partial class App : Application 36 | { 37 | private readonly SummaryViewModel _model; 38 | 39 | /// 40 | /// Constructs a new app adding the current assembly to be tested 41 | /// 42 | public App () 43 | { 44 | InitializeComponent (); 45 | 46 | if(Device.RuntimePlatform == Device.UWP) 47 | { 48 | Resources["defaultBackground"] = Resources["windowsBackground"]; 49 | } 50 | 51 | _model = new SummaryViewModel(); 52 | MainPage = new NavigationPage(new SummaryView(_model)); 53 | #if !NETFX_CORE 54 | AddTestAssembly(Assembly.GetCallingAssembly()); 55 | #endif 56 | } 57 | 58 | /// 59 | /// Adds an assembly to be tested. 60 | /// 61 | /// The test assembly. 62 | /// An optional dictionary of options for loading the assembly. 63 | public void AddTestAssembly(Assembly testAssembly, Dictionary options = null) 64 | { 65 | _model.AddTest(testAssembly, options); 66 | } 67 | 68 | /// 69 | /// User options for the test suite. 70 | /// 71 | public TestOptions Options 72 | { 73 | get { return _model.Options; } 74 | set { _model.Options = value; } 75 | } 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/nunit.xamarin/ViewModel/TestViewModel.cs: -------------------------------------------------------------------------------- 1 | // *********************************************************************** 2 | // Copyright (c) 2015 NUnit Project 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining 5 | // a copy of this software and associated documentation files (the 6 | // "Software"), to deal in the Software without restriction, including 7 | // without limitation the rights to use, copy, modify, merge, publish, 8 | // distribute, sublicense, and/or sell copies of the Software, and to 9 | // permit persons to whom the Software is furnished to do so, subject to 10 | // the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | // *********************************************************************** 23 | 24 | using System; 25 | using System.Text; 26 | using NUnit.Framework.Interfaces; 27 | using NUnit.Runner.Extensions; 28 | using Xamarin.Forms; 29 | 30 | namespace NUnit.Runner.ViewModel 31 | { 32 | class TestViewModel : BaseViewModel 33 | { 34 | public TestViewModel(ITestResult result) 35 | { 36 | TestResult = result; 37 | Message = StringOrNone(result.Message); 38 | Output = StringOrNone(result.Output); 39 | StackTrace = StringOrNone(result.StackTrace); 40 | 41 | var builder = new StringBuilder(); 42 | IPropertyBag props = result.Test.Properties; 43 | foreach (string key in props.Keys) 44 | { 45 | foreach (var value in props[key]) 46 | { 47 | builder.AppendFormat("{0} = {1}{2}", key, value, Environment.NewLine); 48 | } 49 | } 50 | Properties = StringOrNone(builder.ToString()); 51 | } 52 | 53 | public ITestResult TestResult { get; private set; } 54 | public string Message { get; private set; } 55 | public string Output { get; private set; } 56 | public string StackTrace { get; private set; } 57 | public string Properties { get; private set; } 58 | 59 | /// 60 | /// Gets the color for this result. 61 | /// 62 | public Color Color 63 | { 64 | get { return TestResult.ResultState.Color(); } 65 | } 66 | 67 | private string StringOrNone(string str) 68 | { 69 | if (string.IsNullOrWhiteSpace(str)) 70 | return ""; 71 | return str; 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /src/nunit.xamarin/ViewModel/ResultsViewModel.cs: -------------------------------------------------------------------------------- 1 | // *********************************************************************** 2 | // Copyright (c) 2015 NUnit Project 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining 5 | // a copy of this software and associated documentation files (the 6 | // "Software"), to deal in the Software without restriction, including 7 | // without limitation the rights to use, copy, modify, merge, publish, 8 | // distribute, sublicense, and/or sell copies of the Software, and to 9 | // permit persons to whom the Software is furnished to do so, subject to 10 | // the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | // *********************************************************************** 23 | 24 | using System.Collections.Generic; 25 | using System.Collections.ObjectModel; 26 | using NUnit.Framework.Interfaces; 27 | 28 | namespace NUnit.Runner.ViewModel 29 | { 30 | class ResultsViewModel : BaseViewModel 31 | { 32 | /// 33 | /// Constructs the view model 34 | /// 35 | /// The package of all results in run 36 | /// If true, views all tests, otherwise only shows those 37 | /// that did not pass 38 | public ResultsViewModel(IReadOnlyCollection results, bool viewAll) 39 | { 40 | Results = new ObservableCollection(); 41 | foreach (var result in results) 42 | AddTestResults(result, viewAll); 43 | } 44 | 45 | /// 46 | /// A list of tests that did not pass 47 | /// 48 | public ObservableCollection Results { get; private set; } 49 | 50 | /// 51 | /// Add all tests that did not pass to the Results collection 52 | /// 53 | /// 54 | /// 55 | private void AddTestResults(ITestResult result, bool viewAll) 56 | { 57 | if (result.Test.IsSuite) 58 | { 59 | foreach (var childResult in result.Children) 60 | AddTestResults(childResult, viewAll); 61 | } 62 | else if (viewAll || result.ResultState.Status != TestStatus.Passed) 63 | { 64 | Results.Add(new ResultViewModel(result)); 65 | } 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/nunit.xamarin/Services/TestOptions.cs: -------------------------------------------------------------------------------- 1 | // *********************************************************************** 2 | // Copyright (c) 2016 NUnit Project 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining 5 | // a copy of this software and associated documentation files (the 6 | // "Software"), to deal in the Software without restriction, including 7 | // without limitation the rights to use, copy, modify, merge, publish, 8 | // distribute, sublicense, and/or sell copies of the Software, and to 9 | // permit persons to whom the Software is furnished to do so, subject to 10 | // the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | // *********************************************************************** 23 | 24 | using System; 25 | using System.IO; 26 | 27 | namespace NUnit.Runner.Services 28 | { 29 | /// 30 | /// Options for the device test suite. 31 | /// 32 | public class TestOptions 33 | { 34 | const string OutputXmlReportName = "TestResults.xml"; 35 | 36 | /// 37 | /// Constructor 38 | /// 39 | public TestOptions() 40 | { 41 | var path = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); 42 | ResultFilePath = Path.Combine(path, OutputXmlReportName); 43 | } 44 | 45 | /// 46 | /// If True, the tests will run automatically when the app starts 47 | /// otherwise you must run them manually. 48 | /// 49 | public bool AutoRun { get; set; } 50 | 51 | /// 52 | /// If True, the application will terminate automatically after running the tests. 53 | /// 54 | public bool TerminateAfterExecution { get; set; } 55 | 56 | /// 57 | /// Information about the tcp listener host and port. 58 | /// For now, send result as XML to the listening server. 59 | /// 60 | public TcpWriterInfo TcpWriterParameters { get; set; } 61 | 62 | /// 63 | /// Creates a NUnit Xml result file on the host file system using PCLStorage library. 64 | /// 65 | public bool CreateXmlResultFile { get; set; } 66 | 67 | /// 68 | /// File path for the xml result file 69 | /// Default is [LocalStorage]/TestResults.xml 70 | /// 71 | public string ResultFilePath { get; set; } 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/nunit.xamarin/Helpers/TestPackage.cs: -------------------------------------------------------------------------------- 1 | // *********************************************************************** 2 | // Copyright (c) 2017 NUnit Project 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining 5 | // a copy of this software and associated documentation files (the 6 | // "Software"), to deal in the Software without restriction, including 7 | // without limitation the rights to use, copy, modify, merge, publish, 8 | // distribute, sublicense, and/or sell copies of the Software, and to 9 | // permit persons to whom the Software is furnished to do so, subject to 10 | // the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | // *********************************************************************** 23 | 24 | using System.Collections.Generic; 25 | using System.Reflection; 26 | using System.Threading.Tasks; 27 | using NUnit.Framework.Api; 28 | using NUnit.Framework.Interfaces; 29 | using NUnit.Framework.Internal; 30 | 31 | namespace NUnit.Runner.Helpers 32 | { 33 | /// 34 | /// Contains all assemblies for a test run, and controls execution of tests and collection of results 35 | /// 36 | internal class TestPackage 37 | { 38 | private readonly List<(Assembly, Dictionary)> _testAssemblies = new List<(Assembly, Dictionary)>(); 39 | 40 | public void AddAssembly(Assembly testAssembly, Dictionary options = null) 41 | { 42 | _testAssemblies.Add( (testAssembly, options) ); 43 | } 44 | 45 | public async Task ExecuteTests() 46 | { 47 | var resultPackage = new TestRunResult(); 48 | 49 | foreach (var (assembly,options) in _testAssemblies) 50 | { 51 | NUnitTestAssemblyRunner runner = await LoadTestAssemblyAsync(assembly, options).ConfigureAwait(false); 52 | ITestResult result = await Task.Run(() => runner.Run(TestListener.NULL, TestFilter.Empty)).ConfigureAwait(false); 53 | resultPackage.AddResult(result); 54 | } 55 | resultPackage.CompleteTestRun(); 56 | return resultPackage; 57 | } 58 | 59 | private static async Task LoadTestAssemblyAsync(Assembly assembly, Dictionary options) 60 | { 61 | var runner = new NUnitTestAssemblyRunner(new DefaultTestAssemblyBuilder()); 62 | await Task.Run(() => runner.Load(assembly, options ?? new Dictionary())); 63 | return runner; 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. 6 | 7 | ## Our Standards 8 | 9 | Examples of behavior that contributes to creating a positive environment include: 10 | 11 | * Using welcoming and inclusive language 12 | * Being respectful of differing viewpoints and experiences 13 | * Gracefully accepting constructive criticism 14 | * Focusing on what is best for the community 15 | * Showing empathy towards other community members 16 | 17 | Examples of unacceptable behavior by participants include: 18 | 19 | * The use of sexualized language or imagery and unwelcome sexual attention or advances 20 | * Trolling, insulting/derogatory comments, and personal or political attacks 21 | * Public or private harassment 22 | * Publishing others' private information, such as a physical or electronic address, without explicit permission 23 | * Other conduct which could reasonably be considered inappropriate in a professional setting 24 | 25 | ## Our Responsibilities 26 | 27 | Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. 28 | 29 | Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. 30 | 31 | ## Scope 32 | 33 | This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. 34 | 35 | ## Enforcement 36 | 37 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at rob@prouse.org. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. 38 | 39 | Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. 40 | 41 | ## Attribution 42 | 43 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] 44 | 45 | [homepage]: http://contributor-covenant.org 46 | [version]: http://contributor-covenant.org/version/1/4/ 47 | -------------------------------------------------------------------------------- /tests/nunit.runner.tests.uwp/MainPage.xaml.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2018 NUnit Project 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining 4 | // a copy of this software and associated documentation files (the 5 | // "Software"), to deal in the Software without restriction, including 6 | // without limitation the rights to use, copy, modify, merge, publish, 7 | // distribute, sublicense, and/or sell copies of the Software, and to 8 | // permit persons to whom the Software is furnished to do so, subject to 9 | // the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be 12 | // included in all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | // *********************************************************************** 22 | 23 | using System.Reflection; 24 | using System.Collections.Generic; 25 | 26 | using NUnit.Runner.Services; 27 | 28 | namespace NUnit.Runner.Tests 29 | { 30 | public sealed partial class MainPage 31 | { 32 | public MainPage() 33 | { 34 | InitializeComponent(); 35 | 36 | // Windows Universal will not load all tests within the current project, 37 | // you must do it explicitly below 38 | var nunit = new NUnit.Runner.App(); 39 | 40 | // If you want to add tests in another assembly, add a reference and 41 | // duplicate the following line with a type from the referenced assembly 42 | //nunit.AddTestAssembly(typeof(MainPage).GetTypeInfo().Assembly); 43 | // Or, if you want to add tests with an extra test options dictionary 44 | var parameters = new Dictionary { { "Parameter", "Value" } }; 45 | nunit.AddTestAssembly(typeof(MainPage).GetTypeInfo().Assembly, 46 | new Dictionary { { FrameworkPackageSettings.TestParametersDictionary, parameters} }); 47 | 48 | // Available options for testing 49 | nunit.Options = new TestOptions 50 | { 51 | // If True, the tests will run automatically when the app starts 52 | // otherwise you must run them manually. 53 | AutoRun = true, 54 | 55 | // If True, the application will terminate automatically after running the tests. 56 | //TerminateAfterExecution = true, 57 | 58 | // Information about the tcp listener host and port. 59 | // For now, send result as XML to the listening server. 60 | // NOTE: Your UWP App must have Private Networks capability enabled 61 | //TcpWriterParameters = new TcpWriterInfo("192.168.0.108", 13000), 62 | 63 | // Creates a NUnit Xml result file on the host file system using PCLStorage library. 64 | CreateXmlResultFile = false, 65 | 66 | // Choose a different path for the xml result file 67 | // ResultFilePath = System.IO.Path.Combine(Windows.Storage.ApplicationData.Current.TemporaryFolder.Path, "Nunit", "Results.xml") 68 | }; 69 | 70 | LoadApplication(nunit); 71 | } 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /tests/nunit.runner.tests.Droid/MainActivity.cs: -------------------------------------------------------------------------------- 1 | // *********************************************************************** 2 | // Copyright (c) 2015 NUnit Project 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining 5 | // a copy of this software and associated documentation files (the 6 | // "Software"), to deal in the Software without restriction, including 7 | // without limitation the rights to use, copy, modify, merge, publish, 8 | // distribute, sublicense, and/or sell copies of the Software, and to 9 | // permit persons to whom the Software is furnished to do so, subject to 10 | // the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | // *********************************************************************** 23 | 24 | using System.IO; 25 | using Android.App; 26 | using Android.Content.PM; 27 | using Android.OS; 28 | 29 | using NUnit.Runner.Services; 30 | 31 | namespace NUnit.Runner.Tests 32 | { 33 | [Activity(Label = "nunit.runner", Icon = "@drawable/icon", Theme= "@android:style/Theme.Holo.Light", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)] 34 | public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity 35 | { 36 | protected override void OnCreate(Bundle savedInstanceState) 37 | { 38 | base.OnCreate(savedInstanceState); 39 | 40 | global::Xamarin.Forms.Forms.Init(this, savedInstanceState); 41 | 42 | // This will load all tests within the current project 43 | var nunit = new NUnit.Runner.App(); 44 | 45 | // If you want to add tests in another assembly 46 | //nunit.AddTestAssembly(typeof(MyTests).Assembly); 47 | // Or, if you want to add tests with an extra test options dictionary 48 | //nunit.AddTestAssembly(typeof(MyTests).Assembly, new Dictionary()); 49 | 50 | // Available options for testing 51 | nunit.Options = new TestOptions 52 | { 53 | // If True, the tests will run automatically when the app starts 54 | // otherwise you must run them manually. 55 | AutoRun = true, 56 | 57 | // If True, the application will terminate automatically after running the tests. 58 | //TerminateAfterExecution = true, 59 | 60 | // Information about the tcp listener host and port. 61 | // For now, send result as XML to the listening server. 62 | //TcpWriterParameters = new TcpWriterInfo("192.168.0.108", 13000), 63 | 64 | // Creates a NUnit Xml result file on the host file system using PCLStorage library. 65 | CreateXmlResultFile = true, 66 | 67 | // Choose a different path for the xml result file 68 | ResultFilePath = Path.Combine(Environment.ExternalStorageDirectory.Path, Environment.DirectoryDownloads, "Nunit", "Results.xml") 69 | }; 70 | 71 | LoadApplication(nunit); 72 | } 73 | } 74 | } 75 | 76 | -------------------------------------------------------------------------------- /src/nunit.xamarin/Services/TcpWriterInfo.cs: -------------------------------------------------------------------------------- 1 | // *********************************************************************** 2 | // Copyright (c) 2016 NUnit Project 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining 5 | // a copy of this software and associated documentation files (the 6 | // "Software"), to deal in the Software without restriction, including 7 | // without limitation the rights to use, copy, modify, merge, publish, 8 | // distribute, sublicense, and/or sell copies of the Software, and to 9 | // permit persons to whom the Software is furnished to do so, subject to 10 | // the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | // *********************************************************************** 23 | 24 | using System; 25 | 26 | namespace NUnit.Runner.Services 27 | { 28 | /// 29 | /// Represents the host and port to connect to 30 | /// 31 | public class TcpWriterInfo : IEquatable 32 | { 33 | /// 34 | /// Constructs a 35 | /// 36 | /// The host name or IP to connect to 37 | /// The port to connect to 38 | /// The timeout in seconds 39 | public TcpWriterInfo(string hostName, int port, int timeout = 10) 40 | { 41 | if (string.IsNullOrWhiteSpace(hostName)) 42 | { 43 | throw new ArgumentNullException(nameof(hostName)); 44 | } 45 | 46 | if ((port <= 0) || (port > ushort.MaxValue)) 47 | { 48 | throw new ArgumentException("Must be between 1 and ushort.MaxValue", nameof(port)); 49 | } 50 | 51 | if (timeout <= 0) 52 | { 53 | throw new ArgumentException("Must be positive", nameof(timeout)); 54 | } 55 | 56 | Hostname = hostName; 57 | Port = port; 58 | Timeout = timeout; 59 | } 60 | 61 | /// 62 | /// The host to connect to 63 | /// 64 | public string Hostname { get; set; } 65 | 66 | /// 67 | /// The port to connect to 68 | /// 69 | public int Port { get; set; } 70 | 71 | /// 72 | /// The connect timeout in seconds 73 | /// 74 | public int Timeout { get; set; } 75 | 76 | /// 77 | /// Indicates whether the current object is equal to another object of the same type. 78 | /// 79 | /// 80 | /// true if the current object is equal to the parameter; otherwise, false. 81 | /// 82 | /// An object to compare with this object. 83 | public bool Equals(TcpWriterInfo other) => 84 | Hostname.Equals(other.Hostname, StringComparison.OrdinalIgnoreCase) && Port == other.Port; 85 | 86 | /// 87 | /// Gets a string representation of the object 88 | /// 89 | /// 90 | public override string ToString() => $"{Hostname}:{Port}"; 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.sln.docstates 8 | .vs 9 | 10 | # Build results 11 | [Dd]ebug/ 12 | [Dd]ebugPublic/ 13 | [Rr]elease/ 14 | x64/ 15 | build/ 16 | bld/ 17 | [Bb]in/ 18 | [Oo]bj/ 19 | 20 | # Roslyn cache directories 21 | *.ide/ 22 | 23 | # MSTest test Results 24 | [Tt]est[Rr]esult*/ 25 | [Bb]uild[Ll]og.* 26 | 27 | #NUNIT 28 | *.VisualState.xml 29 | TestResult.xml 30 | 31 | # Build Results of an ATL Project 32 | [Dd]ebugPS/ 33 | [Rr]eleasePS/ 34 | dlldata.c 35 | 36 | *_i.c 37 | *_p.c 38 | *_i.h 39 | *.ilk 40 | *.meta 41 | *.obj 42 | *.pch 43 | *.pdb 44 | *.pgc 45 | *.pgd 46 | *.rsp 47 | *.sbr 48 | *.tlb 49 | *.tli 50 | *.tlh 51 | *.tmp 52 | *.tmp_proj 53 | *.log 54 | *.vspscc 55 | *.vssscc 56 | .builds 57 | *.pidb 58 | *.svclog 59 | *.scc 60 | *.csproj.bak 61 | 62 | # Chutzpah Test files 63 | _Chutzpah* 64 | 65 | # Visual C++ cache files 66 | ipch/ 67 | *.aps 68 | *.ncb 69 | *.opensdf 70 | *.sdf 71 | *.cachefile 72 | 73 | # Visual Studio profiler 74 | *.psess 75 | *.vsp 76 | *.vspx 77 | 78 | # TFS 2012 Local Workspace 79 | $tf/ 80 | 81 | # Guidance Automation Toolkit 82 | *.gpState 83 | 84 | # ReSharper is a .NET coding add-in 85 | _ReSharper*/ 86 | *.[Rr]e[Ss]harper 87 | *.DotSettings.user 88 | 89 | # JustCode is a .NET coding addin-in 90 | .JustCode 91 | 92 | # TeamCity is a build add-in 93 | _TeamCity* 94 | 95 | # DotCover is a Code Coverage Tool 96 | *.dotCover 97 | 98 | # NCrunch 99 | _NCrunch_* 100 | .*crunch*.local.xml 101 | 102 | # MightyMoose 103 | *.mm.* 104 | AutoTest.Net/ 105 | 106 | # Web workbench (sass) 107 | .sass-cache/ 108 | 109 | # Installshield output folder 110 | [Ee]xpress/ 111 | 112 | # DocProject is a documentation generator add-in 113 | DocProject/buildhelp/ 114 | DocProject/Help/*.HxT 115 | DocProject/Help/*.HxC 116 | DocProject/Help/*.hhc 117 | DocProject/Help/*.hhk 118 | DocProject/Help/*.hhp 119 | DocProject/Help/Html2 120 | DocProject/Help/html 121 | 122 | # Click-Once directory 123 | publish/ 124 | 125 | # Publish Web Output 126 | *.[Pp]ublish.xml 127 | *.azurePubxml 128 | ## TODO: Comment the next line if you want to checkin your 129 | ## web deploy settings but do note that will include unencrypted 130 | ## passwords 131 | #*.pubxml 132 | 133 | # NuGet Packages Directory 134 | packages/* 135 | ## TODO: If the tool you use requires repositories.config 136 | ## uncomment the next line 137 | #!packages/repositories.config 138 | 139 | # Enable "build/" folder in the NuGet Packages folder since 140 | # NuGet packages use it for MSBuild targets. 141 | # This line needs to be after the ignore of the build folder 142 | # (and the packages folder if the line above has been uncommented) 143 | !packages/build/ 144 | 145 | # Windows Azure Build Output 146 | csx/ 147 | *.build.csdef 148 | 149 | # Windows Store app package directory 150 | AppPackages/ 151 | 152 | # Others 153 | sql/ 154 | *.Cache 155 | ClientBin/ 156 | [Ss]tyle[Cc]op.* 157 | ~$* 158 | *~ 159 | *.dbmdl 160 | *.dbproj.schemaview 161 | *.pfx 162 | *.publishsettings 163 | node_modules/ 164 | 165 | # RIA/Silverlight projects 166 | Generated_Code/ 167 | 168 | # Backup & report files from converting an old project file 169 | # to a newer Visual Studio version. Backup files are not needed, 170 | # because we have git ;-) 171 | _UpgradeReport_Files/ 172 | Backup*/ 173 | UpgradeLog*.XML 174 | UpgradeLog*.htm 175 | 176 | # SQL Server files 177 | *.mdf 178 | *.ldf 179 | 180 | # Business Intelligence projects 181 | *.rdl.data 182 | *.bim.layout 183 | *.bim_*.settings 184 | 185 | # Microsoft Fakes 186 | FakesAssemblies/ 187 | 188 | # LightSwitch generated files 189 | GeneratedArtifacts/ 190 | _Pvt_Extensions/ 191 | ModelManifest.xml 192 | 193 | # Cake tools 194 | .dotnet 195 | tools/* 196 | 197 | # NuGet restore 198 | *project.lock.json 199 | 200 | # Android Xamarin 201 | Resource.Designer.cs -------------------------------------------------------------------------------- /tests/nunit.runner.tests.iOS/AppDelegate.cs: -------------------------------------------------------------------------------- 1 | // *********************************************************************** 2 | // Copyright (c) 2015 NUnit Project 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining 5 | // a copy of this software and associated documentation files (the 6 | // "Software"), to deal in the Software without restriction, including 7 | // without limitation the rights to use, copy, modify, merge, publish, 8 | // distribute, sublicense, and/or sell copies of the Software, and to 9 | // permit persons to whom the Software is furnished to do so, subject to 10 | // the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | // *********************************************************************** 23 | 24 | using System; 25 | using System.IO; 26 | using Foundation; 27 | 28 | using NUnit.Runner.Services; 29 | 30 | using UIKit; 31 | 32 | namespace NUnit.Runner.Tests 33 | { 34 | // The UIApplicationDelegate for the application. This class is responsible for launching the 35 | // User Interface of the application, as well as listening (and optionally responding) to 36 | // application events from iOS. 37 | [Register("AppDelegate")] 38 | public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate 39 | { 40 | // 41 | // This method is invoked when the application has loaded and is ready to run. In this 42 | // method you should instantiate the window, load the UI into it and then make the window 43 | // visible. 44 | // 45 | // You have 17 seconds to return from this method, or iOS will terminate your application. 46 | // 47 | public override bool FinishedLaunching(UIApplication app, NSDictionary options) 48 | { 49 | global::Xamarin.Forms.Forms.Init(); 50 | 51 | // This will load all tests within the current project 52 | var nunit = new NUnit.Runner.App(); 53 | 54 | // If you want to add tests in another assembly 55 | //nunit.AddTestAssembly(typeof(MyTests).Assembly); 56 | // Or, if you want to add tests with an extra test options dictionary 57 | //nunit.AddTestAssembly(typeof(MyTests).Assembly, new Dictionary()); 58 | 59 | // Available options for testing 60 | nunit.Options = new TestOptions 61 | { 62 | // If True, the tests will run automatically when the app starts 63 | // otherwise you must run them manually. 64 | AutoRun = true, 65 | 66 | // If True, the application will terminate automatically after running the tests. 67 | //TerminateAfterExecution = true, 68 | 69 | // Information about the tcp listener host and port. 70 | // For now, send result as XML to the listening server. 71 | //TcpWriterParameters = new TcpWriterInfo("192.168.0.108", 13000), 72 | 73 | // Creates a NUnit Xml result file on the host file system using PCLStorage library. 74 | CreateXmlResultFile = true, 75 | 76 | // Choose a different path for the xml result file (ios file share / library directory) 77 | ResultFilePath = Path.Combine(NSFileManager.DefaultManager.GetUrls(NSSearchPathDirectory.LibraryDirectory, NSSearchPathDomain.User)[0].Path, "Results.xml") 78 | }; 79 | 80 | LoadApplication(nunit); 81 | 82 | return base.FinishedLaunching(app, options); 83 | } 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /tests/nunit.runner.tests.Droid/nunit.runner.tests.Droid.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Debug 5 | AnyCPU 6 | {FEC118A7-A5B1-4058-898E-2DE513708A07} 7 | {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 8 | Library 9 | NUnit.Runner.Tests 10 | nunit.runner.tests.Droid 11 | v8.1 12 | True 13 | Resources\Resource.designer.cs 14 | Resource 15 | Properties\AndroidManifest.xml 16 | Resources 17 | Assets 18 | true 19 | 20 | 21 | 22 | 23 | true 24 | full 25 | false 26 | bin\Debug 27 | DEBUG; 28 | prompt 29 | 4 30 | None 31 | 32 | 33 | true 34 | pdbonly 35 | true 36 | bin\Release 37 | prompt 38 | 4 39 | true 40 | false 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | {a9479ad9-ee64-4590-927c-ffdc13ac7c70} 78 | nunit.xamarin 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /src/nunit.xamarin/Services/TcpWriter.cs: -------------------------------------------------------------------------------- 1 | // *********************************************************************** 2 | // Copyright (c) 2016 NUnit Project 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining 5 | // a copy of this software and associated documentation files (the 6 | // "Software"), to deal in the Software without restriction, including 7 | // without limitation the rights to use, copy, modify, merge, publish, 8 | // distribute, sublicense, and/or sell copies of the Software, and to 9 | // permit persons to whom the Software is furnished to do so, subject to 10 | // the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | // *********************************************************************** 23 | 24 | using System; 25 | using System.IO; 26 | 27 | using System.Threading.Tasks; 28 | using Xamarin.Forms; 29 | using NUnit.Runner.Messages; 30 | using System.Threading; 31 | 32 | #if NETFX_CORE 33 | using Windows.Networking; 34 | using Windows.Networking.Sockets; 35 | #else 36 | using System.Net.Sockets; 37 | #endif 38 | 39 | namespace NUnit.Runner.Services 40 | { 41 | /// 42 | /// Redirects output to a Tcp connection 43 | /// 44 | class TcpWriter : TextWriter 45 | { 46 | #if NETFX_CORE 47 | StreamSocket _socket; 48 | #endif 49 | StreamWriter _writer; 50 | readonly TcpWriterInfo _info; 51 | 52 | public TcpWriter(TcpWriterInfo info) 53 | { 54 | if (info == null) 55 | throw new ArgumentNullException(nameof(info)); 56 | 57 | _info = info; 58 | } 59 | 60 | public async Task Connect() 61 | { 62 | #if NETFX_CORE 63 | try 64 | { 65 | _socket = new StreamSocket(); 66 | var cts = new CancellationTokenSource(); 67 | cts.CancelAfter(TimeSpan.FromSeconds(_info.Timeout)); 68 | 69 | await _socket.ConnectAsync(new HostName(_info.Hostname), _info.Port.ToString()).AsTask(); 70 | _writer = new StreamWriter(_socket.OutputStream.AsStreamForWrite()); 71 | } 72 | catch (TaskCanceledException) 73 | { 74 | MessagingCenter.Send(new ErrorMessage($"Timeout connecting to {_info} after {_info.Timeout} seconds.\n\nIs your server running?"), ErrorMessage.Name); 75 | } 76 | catch (Exception ex) 77 | { 78 | MessagingCenter.Send(new ErrorMessage(ex.Message), ErrorMessage.Name); 79 | } 80 | #else 81 | try 82 | { 83 | TcpClient client = new TcpClient(); 84 | Task connect = client.ConnectAsync(_info.Hostname, _info.Port); 85 | Task timeout = Task.Delay(TimeSpan.FromSeconds(_info.Timeout)); 86 | if(await Task.WhenAny(connect, timeout) == timeout) 87 | { 88 | throw new TimeoutException(); 89 | } 90 | NetworkStream stream = client.GetStream(); 91 | _writer = new StreamWriter(stream); 92 | } 93 | catch (TimeoutException) 94 | { 95 | MessagingCenter.Send(new ErrorMessage($"Timeout connecting to {_info} after {_info.Timeout} seconds.\n\nIs your server running?"), ErrorMessage.Name); 96 | } 97 | catch (Exception ex) 98 | { 99 | MessagingCenter.Send(new ErrorMessage(ex.Message), ErrorMessage.Name); 100 | } 101 | #endif 102 | } 103 | 104 | public override void Write(char value) 105 | { 106 | _writer?.Write(value); 107 | } 108 | 109 | public override void Write(string value) 110 | { 111 | _writer?.Write(value); 112 | } 113 | 114 | public override void WriteLine(string value) 115 | { 116 | _writer?.WriteLine(value); 117 | _writer?.Flush(); 118 | } 119 | 120 | public override System.Text.Encoding Encoding => System.Text.Encoding.UTF8; 121 | 122 | protected override void Dispose(bool disposing) 123 | { 124 | _writer?.Dispose(); 125 | #if NETFX_CORE 126 | _socket?.Dispose(); 127 | #endif 128 | } 129 | } 130 | } -------------------------------------------------------------------------------- /tests/nunit.runner.tests.uwp/App.xaml.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2018 NUnit Project 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining 4 | // a copy of this software and associated documentation files (the 5 | // "Software"), to deal in the Software without restriction, including 6 | // without limitation the rights to use, copy, modify, merge, publish, 7 | // distribute, sublicense, and/or sell copies of the Software, and to 8 | // permit persons to whom the Software is furnished to do so, subject to 9 | // the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be 12 | // included in all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | // *********************************************************************** 22 | 23 | using System; 24 | using Windows.ApplicationModel; 25 | using Windows.ApplicationModel.Activation; 26 | using Windows.UI.Xaml; 27 | using Windows.UI.Xaml.Controls; 28 | using Windows.UI.Xaml.Navigation; 29 | 30 | namespace NUnit.Runner.Tests 31 | { 32 | /// 33 | /// Provides application-specific behavior to supplement the default Application class. 34 | /// 35 | sealed partial class App : Application 36 | { 37 | /// 38 | /// Initializes the singleton application object. This is the first line of authored code 39 | /// executed, and as such is the logical equivalent of main() or WinMain(). 40 | /// 41 | public App() 42 | { 43 | this.InitializeComponent(); 44 | this.Suspending += OnSuspending; 45 | } 46 | 47 | /// 48 | /// Invoked when the application is launched normally by the end user. Other entry points 49 | /// will be used such as when the application is launched to open a specific file. 50 | /// 51 | /// Details about the launch request and process. 52 | protected override void OnLaunched(LaunchActivatedEventArgs e) 53 | { 54 | Frame rootFrame = Window.Current.Content as Frame; 55 | 56 | // Do not repeat app initialization when the Window already has content, 57 | // just ensure that the window is active 58 | if (rootFrame == null) 59 | { 60 | // Create a Frame to act as the navigation context and navigate to the first page 61 | rootFrame = new Frame(); 62 | 63 | rootFrame.NavigationFailed += OnNavigationFailed; 64 | 65 | Xamarin.Forms.Forms.Init(e); 66 | 67 | if (e.PreviousExecutionState == ApplicationExecutionState.Terminated) 68 | { 69 | //TODO: Load state from previously suspended application 70 | } 71 | 72 | // Place the frame in the current Window 73 | Window.Current.Content = rootFrame; 74 | } 75 | 76 | if (rootFrame.Content == null) 77 | { 78 | // When the navigation stack isn't restored navigate to the first page, 79 | // configuring the new page by passing required information as a navigation 80 | // parameter 81 | rootFrame.Navigate(typeof(MainPage), e.Arguments); 82 | } 83 | // Ensure the current window is active 84 | Window.Current.Activate(); 85 | } 86 | 87 | /// 88 | /// Invoked when Navigation to a certain page fails 89 | /// 90 | /// The Frame which failed navigation 91 | /// Details about the navigation failure 92 | void OnNavigationFailed(object sender, NavigationFailedEventArgs e) 93 | { 94 | throw new Exception("Failed to load Page " + e.SourcePageType.FullName); 95 | } 96 | 97 | /// 98 | /// Invoked when application execution is being suspended. Application state is saved 99 | /// without knowing whether the application will be terminated or resumed with the contents 100 | /// of memory still intact. 101 | /// 102 | /// The source of the suspend request. 103 | /// Details about the suspend request. 104 | private void OnSuspending(object sender, SuspendingEventArgs e) 105 | { 106 | var deferral = e.SuspendingOperation.GetDeferral(); 107 | //TODO: Save application state and stop any background activity 108 | deferral.Complete(); 109 | } 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /src/nunit.xamarin/ViewModel/SummaryViewModel.cs: -------------------------------------------------------------------------------- 1 | // *********************************************************************** 2 | // Copyright (c) 2015 NUnit Project 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining 5 | // a copy of this software and associated documentation files (the 6 | // "Software"), to deal in the Software without restriction, including 7 | // without limitation the rights to use, copy, modify, merge, publish, 8 | // distribute, sublicense, and/or sell copies of the Software, and to 9 | // permit persons to whom the Software is furnished to do so, subject to 10 | // the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | // *********************************************************************** 23 | 24 | using System.Reflection; 25 | using System.Collections.Generic; 26 | using System.Threading.Tasks; 27 | using System.Windows.Input; 28 | using NUnit.Runner.Helpers; 29 | using NUnit.Runner.View; 30 | 31 | using NUnit.Runner.Services; 32 | 33 | using Xamarin.Forms; 34 | 35 | namespace NUnit.Runner.ViewModel 36 | { 37 | class SummaryViewModel : BaseViewModel 38 | { 39 | readonly TestPackage _testPackage; 40 | ResultSummary _results; 41 | bool _running; 42 | TestResultProcessor _resultProcessor; 43 | 44 | public SummaryViewModel() 45 | { 46 | _testPackage = new TestPackage(); 47 | RunTestsCommand = new Command(async o => await ExecuteTestsAync(), o => !Running); 48 | ViewAllResultsCommand = new Command( 49 | async o => await Navigation.PushAsync(new ResultsView(new ResultsViewModel(_results.GetTestResults(), true))), 50 | o => !HasResults); 51 | ViewFailedResultsCommand = new Command( 52 | async o => await Navigation.PushAsync(new ResultsView(new ResultsViewModel(_results.GetTestResults(), false))), 53 | o => !HasResults); 54 | } 55 | 56 | private TestOptions options; 57 | 58 | /// 59 | /// User options for the test suite. 60 | /// 61 | public TestOptions Options { 62 | get 63 | { 64 | if(options == null) 65 | { 66 | options = new TestOptions(); 67 | } 68 | return options; 69 | } 70 | set 71 | { 72 | options = value; 73 | } 74 | } 75 | 76 | /// 77 | /// Called from the view when the view is appearing 78 | /// 79 | public void OnAppearing() 80 | { 81 | if(Options.AutoRun) 82 | { 83 | // Don't rerun if we navigate back 84 | Options.AutoRun = false; 85 | RunTestsCommand.Execute(null); 86 | } 87 | } 88 | 89 | /// 90 | /// The overall test results 91 | /// 92 | public ResultSummary Results 93 | { 94 | get { return _results; } 95 | set 96 | { 97 | if (Equals(value, _results)) return; 98 | _results = value; 99 | OnPropertyChanged(); 100 | OnPropertyChanged("HasResults"); 101 | } 102 | } 103 | 104 | /// 105 | /// True if tests are currently running 106 | /// 107 | public bool Running 108 | { 109 | get { return _running; } 110 | set 111 | { 112 | if (value.Equals(_running)) return; 113 | _running = value; 114 | OnPropertyChanged(); 115 | } 116 | } 117 | 118 | /// 119 | /// True if we have test results to display 120 | /// 121 | public bool HasResults => Results != null; 122 | 123 | public ICommand RunTestsCommand { set; get; } 124 | public ICommand ViewAllResultsCommand { set; get; } 125 | public ICommand ViewFailedResultsCommand { set; get; } 126 | 127 | /// 128 | /// Adds an assembly to be tested. 129 | /// 130 | /// The test assembly. 131 | /// 132 | internal void AddTest(Assembly testAssembly, Dictionary options = null) 133 | { 134 | _testPackage.AddAssembly(testAssembly, options); 135 | } 136 | 137 | async Task ExecuteTestsAync() 138 | { 139 | Running = true; 140 | Results = null; 141 | TestRunResult results = await _testPackage.ExecuteTests(); 142 | ResultSummary summary = new ResultSummary(results); 143 | 144 | _resultProcessor = TestResultProcessor.BuildChainOfResponsability(Options); 145 | await _resultProcessor.Process(summary).ConfigureAwait(false); 146 | 147 | Device.BeginInvokeOnMainThread( 148 | () => 149 | { 150 | Results = summary; 151 | Running = false; 152 | 153 | if (Options.TerminateAfterExecution) 154 | TerminateWithSuccess(); 155 | }); 156 | } 157 | 158 | public static void TerminateWithSuccess() 159 | { 160 | #if __IOS__ 161 | var selector = new ObjCRuntime.Selector("terminateWithSuccess"); 162 | UIKit.UIApplication.SharedApplication.PerformSelector(selector, UIKit.UIApplication.SharedApplication, 0); 163 | #elif __DROID__ 164 | System.Environment.Exit(0); 165 | #elif WINDOWS_UWP 166 | Windows.UI.Xaml.Application.Current.Exit(); 167 | #endif 168 | } 169 | } 170 | } 171 | -------------------------------------------------------------------------------- /tests/nunit.runner.tests.iOS/nunit.runner.tests.iOS.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Debug 5 | iPhoneSimulator 6 | 8.0.30703 7 | 2.0 8 | {17A2B97C-56EA-40B8-8901-5E0728876657} 9 | {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 10 | Exe 11 | NUnit.Runner.Tests 12 | Resources 13 | nunit.runner.tests.iOS 14 | 15 | 16 | 17 | 18 | true 19 | full 20 | false 21 | bin\iPhoneSimulator\Debug\ 22 | DEBUG 23 | prompt 24 | 4 25 | false 26 | x86_64 27 | None 28 | true 29 | Entitlements.plist 30 | 31 | 32 | none 33 | true 34 | bin\iPhoneSimulator\Release\ 35 | prompt 36 | 4 37 | None 38 | x86_64 39 | false 40 | Entitlements.plist 41 | 42 | 43 | true 44 | full 45 | false 46 | bin\iPhone\Debug\ 47 | DEBUG 48 | prompt 49 | 4 50 | false 51 | ARM64 52 | iPhone Developer 53 | true 54 | Entitlements.plist 55 | 56 | 57 | none 58 | true 59 | bin\iPhone\Release\ 60 | prompt 61 | 4 62 | ARM64 63 | false 64 | iPhone Developer 65 | Entitlements.plist 66 | 67 | 68 | none 69 | True 70 | bin\iPhone\Ad-Hoc\ 71 | prompt 72 | 4 73 | False 74 | ARM64 75 | True 76 | Automatic:AdHoc 77 | iPhone Distribution 78 | Entitlements.plist 79 | 80 | 81 | none 82 | True 83 | bin\iPhone\AppStore\ 84 | prompt 85 | 4 86 | False 87 | ARM64 88 | Automatic:AppStore 89 | iPhone Distribution 90 | Entitlements.plist 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | {a9479ad9-ee64-4590-927c-ffdc13ac7c70} 131 | nunit.xamarin 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | -------------------------------------------------------------------------------- /tests/nunit.runner.tests.uwp/nunit.runner.tests.uwp.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | x86 7 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC} 8 | AppContainerExe 9 | Properties 10 | NUnit.Runner.Tests 11 | nunit.runner.tests.uwp 12 | en-US 13 | UAP 14 | 10.0.16299.0 15 | 10.0.16299.0 16 | 14 17 | true 18 | 512 19 | {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 20 | nunit.runner.tests.uwp_TemporaryKey.pfx 21 | 22 | 23 | true 24 | bin\ARM\Debug\ 25 | DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP 26 | ;2008 27 | full 28 | ARM 29 | false 30 | prompt 31 | true 32 | 33 | 34 | bin\ARM\Release\ 35 | TRACE;NETFX_CORE;WINDOWS_UWP 36 | true 37 | ;2008 38 | pdbonly 39 | ARM 40 | false 41 | prompt 42 | true 43 | true 44 | 45 | 46 | true 47 | bin\x64\Debug\ 48 | DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP 49 | ;2008 50 | full 51 | x64 52 | false 53 | prompt 54 | true 55 | 56 | 57 | bin\x64\Release\ 58 | TRACE;NETFX_CORE;WINDOWS_UWP 59 | true 60 | ;2008 61 | pdbonly 62 | x64 63 | false 64 | prompt 65 | true 66 | true 67 | 68 | 69 | true 70 | bin\x86\Debug\ 71 | DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP 72 | ;2008 73 | full 74 | x86 75 | false 76 | prompt 77 | true 78 | 79 | 80 | bin\x86\Release\ 81 | TRACE;NETFX_CORE;WINDOWS_UWP 82 | true 83 | ;2008 84 | pdbonly 85 | x86 86 | false 87 | prompt 88 | true 89 | true 90 | 91 | 92 | 93 | App.xaml 94 | 95 | 96 | MainPage.xaml 97 | 98 | 99 | 100 | 101 | 102 | Designer 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | MSBuild:Compile 119 | Designer 120 | 121 | 122 | MSBuild:Compile 123 | Designer 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | {a9479ad9-ee64-4590-927c-ffdc13ac7c70} 133 | nunit.xamarin 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 14.0 142 | 143 | 144 | -------------------------------------------------------------------------------- /src/nunit.xamarin/View/SummaryView.xaml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 21 | 22 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 58 | 59 | 60 | 63 | 64 | 65 | 68 | 69 | 72 | 73 | 76 | 77 | 80 | 81 | 82 | 85 | 86 | 89 | 90 | 93 | 94 | 97 | 98 | 101 | 102 | 103 | 106 | 107 | 110 | 111 | 114 | 115 | 116 | 117 | 118 | 125 | 132 | 133 | -------------------------------------------------------------------------------- /src/nunit.xamarin/Helpers/ResultSummary.cs: -------------------------------------------------------------------------------- 1 | // *********************************************************************** 2 | // Copyright (c) 2017 NUnit Project 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining 5 | // a copy of this software and associated documentation files (the 6 | // "Software"), to deal in the Software without restriction, including 7 | // without limitation the rights to use, copy, modify, merge, publish, 8 | // distribute, sublicense, and/or sell copies of the Software, and to 9 | // permit persons to whom the Software is furnished to do so, subject to 10 | // the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | // *********************************************************************** 23 | 24 | using System; 25 | using System.Collections.Generic; 26 | using System.Globalization; 27 | using System.Reflection; 28 | using System.Xml.Linq; 29 | using NUnit.Framework.Interfaces; 30 | using NUnit.Runner.Extensions; 31 | using Xamarin.Forms; 32 | 33 | namespace NUnit.Runner.Helpers 34 | { 35 | /// 36 | /// Helper class used to summarize the result of a test run. 37 | /// 38 | internal class ResultSummary 39 | { 40 | private readonly TestRunResult _results; 41 | private XDocument _xmlResults; 42 | 43 | #region Constructor 44 | 45 | public ResultSummary(TestRunResult results) 46 | { 47 | _results = results; 48 | Initialize(); 49 | Summarize(results.TestResults); 50 | StartTime = results.StartTime; 51 | EndTime = results.EndTime; 52 | } 53 | 54 | #endregion 55 | 56 | #region Public Methods 57 | /// 58 | ///Gets all TestResults 59 | /// 60 | /// 61 | public IReadOnlyCollection GetTestResults() 62 | { 63 | return _results.TestResults; 64 | } 65 | 66 | /// 67 | /// Summarizes all of the results and returns the test result xml document 68 | /// 69 | /// 70 | public XDocument GetTestXml() 71 | { 72 | if (_xmlResults != null) 73 | return _xmlResults; 74 | 75 | var test = new XElement("test-run"); 76 | test.Add(new XAttribute("id", "0")); 77 | test.Add(new XAttribute("testcasecount", TestCount)); 78 | test.Add(new XAttribute("total", TestCount)); 79 | test.Add(new XAttribute("passed", PassCount)); 80 | test.Add(new XAttribute("failed", FailureCount)); 81 | test.Add(new XAttribute("inconclusive", InconclusiveCount)); 82 | test.Add(new XAttribute("skipped", SkipCount)); 83 | test.Add(new XAttribute("asserts", AssertCount)); 84 | test.Add(new XAttribute("result", OverallResult)); 85 | 86 | test.Add(new XAttribute("xamarin-runner-version", typeof(ResultSummary).GetTypeInfo().Assembly.GetName().Version.ToString())); 87 | 88 | var startTime = _results.StartTime; 89 | var endTime = _results.EndTime; 90 | var duration = endTime.Subtract(startTime).TotalSeconds; 91 | 92 | test.Add(new XAttribute("start-time", startTime.ToString("u"))); 93 | test.Add(new XAttribute("end-time", endTime.ToString("u"))); 94 | test.Add(new XAttribute("duration", duration.ToString("0.000000", NumberFormatInfo.InvariantInfo))); 95 | 96 | foreach (var result in _results.TestResults) 97 | test.Add(XElement.Parse(result.ToXml(true).OuterXml)); 98 | 99 | _xmlResults = new XDocument(test); 100 | return _xmlResults; 101 | } 102 | 103 | #endregion 104 | 105 | #region Properties 106 | 107 | /// 108 | /// The overall result of the test run. 109 | /// 110 | public TestStatus OverallResult { get; private set; } 111 | 112 | /// 113 | /// Gets the color for the overall result. 114 | /// 115 | public Color OverallResultColor 116 | { 117 | get { return new ResultState(OverallResult).Color(); } 118 | } 119 | 120 | /// 121 | /// Gets the number of test cases for which results 122 | /// have been summarized. Any tests excluded by use of 123 | /// Category or Explicit attributes are not counted. 124 | /// 125 | public int TestCount { get; private set; } 126 | 127 | /// 128 | /// Gets the number of asserts 129 | /// 130 | public int AssertCount { get; private set; } 131 | 132 | /// 133 | /// Returns the number of test cases actually run. 134 | /// 135 | public int RunCount { get { return PassCount + FailureCount + ErrorCount + InconclusiveCount; } } 136 | 137 | /// 138 | /// Returns the number of test cases not run for any reason. 139 | /// 140 | public int NotRunCount 141 | { 142 | get { return IgnoreCount + ExplicitCount + InvalidCount + SkipCount; } 143 | } 144 | 145 | /// 146 | /// Gets the count of passed tests 147 | /// 148 | public int PassCount { get; private set; } 149 | 150 | /// 151 | /// Gets count of failed tests, excluding errors and invalid tests 152 | /// 153 | public int FailureCount { get; private set; } 154 | 155 | /// 156 | /// Gets the error count 157 | /// 158 | public int ErrorCount { get; private set; } 159 | 160 | /// 161 | /// Gets the count of inconclusive tests 162 | /// 163 | public int InconclusiveCount { get; private set; } 164 | 165 | /// 166 | /// Returns the number of test cases that were not runnable 167 | /// due to errors in the signature of the class or method. 168 | /// Such tests are also counted as Errors. 169 | /// 170 | public int InvalidCount { get; private set; } 171 | 172 | /// 173 | /// Gets the count of skipped tests, excluding ignored and explicit tests 174 | /// 175 | public int SkipCount { get; private set; } 176 | 177 | /// 178 | /// Gets the ignore count 179 | /// 180 | public int IgnoreCount { get; private set; } 181 | 182 | /// 183 | /// Gets the count of tests not run because the are Explicit 184 | /// 185 | public int ExplicitCount { get; private set; } 186 | 187 | /// 188 | /// Gets the time when the test suite started running 189 | /// 190 | public DateTime StartTime { get; private set; } 191 | 192 | /// 193 | /// Gets the time when the test suite completed execution 194 | /// 195 | public DateTime EndTime { get; private set; } 196 | 197 | /// 198 | /// Gets how long it took to execute the tests 199 | /// 200 | public TimeSpan Duration 201 | { 202 | get { return EndTime.Subtract(StartTime); } 203 | } 204 | 205 | #endregion 206 | 207 | #region Helper Methods 208 | 209 | private void Initialize() 210 | { 211 | TestCount = 0; 212 | PassCount = 0; 213 | FailureCount = 0; 214 | ErrorCount = 0; 215 | InconclusiveCount = 0; 216 | SkipCount = 0; 217 | IgnoreCount = 0; 218 | ExplicitCount = 0; 219 | InvalidCount = 0; 220 | OverallResult = TestStatus.Inconclusive; 221 | } 222 | 223 | private void Summarize(IEnumerable results) 224 | { 225 | foreach (var result in results) 226 | Summarize(result); 227 | } 228 | 229 | private void Summarize(ITestResult result) 230 | { 231 | var status = TestStatus.Inconclusive; 232 | 233 | if (result.Test.IsSuite) 234 | { 235 | foreach (ITestResult r in result.Children) 236 | Summarize(r); 237 | } 238 | else 239 | { 240 | TestCount++; 241 | AssertCount += result.AssertCount; 242 | switch (result.ResultState.Status) 243 | { 244 | case TestStatus.Passed: 245 | PassCount++; 246 | if (status == TestStatus.Inconclusive) 247 | status = TestStatus.Passed; 248 | break; 249 | case TestStatus.Failed: 250 | status = TestStatus.Failed; 251 | if (result.ResultState == ResultState.Failure) 252 | FailureCount++; 253 | else if (result.ResultState == ResultState.NotRunnable) 254 | InvalidCount++; 255 | else 256 | ErrorCount++; 257 | break; 258 | case TestStatus.Skipped: 259 | if (result.ResultState == ResultState.Ignored) 260 | IgnoreCount++; 261 | else if (result.ResultState == ResultState.Explicit) 262 | ExplicitCount++; 263 | else 264 | SkipCount++; 265 | break; 266 | case TestStatus.Inconclusive: 267 | InconclusiveCount++; 268 | break; 269 | } 270 | 271 | switch (OverallResult) 272 | { 273 | case TestStatus.Inconclusive: 274 | OverallResult = status; 275 | break; 276 | case TestStatus.Passed: 277 | if (status == TestStatus.Failed) 278 | OverallResult = status; 279 | break; 280 | case TestStatus.Skipped: 281 | case TestStatus.Failed: 282 | default: 283 | break; 284 | } 285 | } 286 | } 287 | #endregion 288 | } 289 | } -------------------------------------------------------------------------------- /nunit.runner.sln.DotSettings: -------------------------------------------------------------------------------- 1 | 2 | True 3 | True 4 | SUGGESTION 5 | True 6 | True 7 | True 8 | True 9 | True 10 | TOGETHER_SAME_LINE 11 | False 12 | True 13 | True 14 | False 15 | *********************************************************************** 16 | Copyright (c) $CURRENT_YEAR$ NUnit Project 17 | 18 | Permission is hereby granted, free of charge, to any person obtaining 19 | a copy of this software and associated documentation files (the 20 | "Software"), to deal in the Software without restriction, including 21 | without limitation the rights to use, copy, modify, merge, publish, 22 | distribute, sublicense, and/or sell copies of the Software, and to 23 | permit persons to whom the Software is furnished to do so, subject to 24 | the following conditions: 25 | 26 | The above copyright notice and this permission notice shall be 27 | included in all copies or substantial portions of the Software. 28 | 29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 30 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 31 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 32 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 33 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 34 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 35 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 36 | *********************************************************************** 37 | 38 | <Policy Inspect="True" Prefix="_" Suffix="" Style="aaBb"><ExtraRule Prefix="" Suffix="" Style="aaBb" /></Policy> 39 | <Policy Inspect="True" Prefix="_" Suffix="" Style="aaBb"><ExtraRule Prefix="" Suffix="" Style="aaBb" /></Policy> 40 | True 41 | True 42 | True 43 | True 44 | 45 | 46 | getCurrentDate("yyyy") 47 | -1 48 | copyright 49 | NUnit Copyright 50 | // *********************************************************************** 51 | // Copyright (c) $YEAR$ NUnit Project 52 | // 53 | // Permission is hereby granted, free of charge, to any person obtaining 54 | // a copy of this software and associated documentation files (the 55 | // "Software"), to deal in the Software without restriction, including 56 | // without limitation the rights to use, copy, modify, merge, publish, 57 | // distribute, sublicense, and/or sell copies of the Software, and to 58 | // permit persons to whom the Software is furnished to do so, subject to 59 | // the following conditions: 60 | // 61 | // The above copyright notice and this permission notice shall be 62 | // included in all copies or substantial portions of the Software. 63 | // 64 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 65 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 66 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 67 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 68 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 69 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 70 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 71 | // *********************************************************************** 72 | True 73 | True 74 | True 75 | True 76 | InCSharpTypeAndNamespace 77 | 2.0 78 | True 79 | 0 80 | 81 | 82 | True 83 | True 84 | Test Method 85 | True 86 | constant("TestMethod") 87 | 0 88 | True 89 | True 90 | 2.0 91 | InCSharpTypeMember 92 | test 93 | True 94 | [Test] 95 | public void $TEST_METHOD$() 96 | { 97 | $END$ 98 | } 99 | True 100 | True 101 | Test Fixture 102 | True 103 | constant("TestClass") 104 | 0 105 | True 106 | constant("TestMethod") 107 | 1 108 | True 109 | True 110 | 2.0 111 | InCSharpTypeAndNamespace 112 | True 113 | 2.0 114 | InCSharpTypeMember 115 | tf 116 | True 117 | [TestFixture] 118 | public class $TEST_CLASS$ 119 | { 120 | [Test] 121 | public void $TEST_METHOD$() 122 | { 123 | $END$ 124 | } 125 | } 126 | True 127 | True 128 | cs 129 | TestClass 130 | True 131 | &Test Class 132 | True 133 | getFileNameWithoutExtension() 134 | -1 135 | 2 136 | True 137 | fileheader() 138 | -1 139 | 0 140 | True 141 | fileDefaultNamespace() 142 | -1 143 | 1 144 | True 145 | constant("TestMethod") 146 | 3 147 | True 148 | True 149 | InCSharpProjectFile 150 | True 151 | $HEADER$ 152 | #region Using Directives 153 | 154 | using System; 155 | using NUnit.Framework; 156 | 157 | #endregion 158 | 159 | namespace $NAMESPACE$ 160 | { 161 | [TestFixture] 162 | public class $CLASS$ 163 | { 164 | [Test] 165 | public void $TEST_METHOD$() 166 | { 167 | $END$ 168 | } 169 | } 170 | } -------------------------------------------------------------------------------- /nunit.xamarin.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | VisualStudioVersion = 15.0.27428.2005 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{DABD2667-0EF4-4814-8353-8675E1C8F95E}" 7 | ProjectSection(SolutionItems) = preProject 8 | .gitattributes = .gitattributes 9 | .gitignore = .gitignore 10 | build.cake = build.cake 11 | README.md = README.md 12 | EndProjectSection 13 | EndProject 14 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Src", "Src", "{B3AE763A-DC9C-4F5D-B5F0-97A1B10D147B}" 15 | EndProject 16 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{040381B1-C9E8-4D7C-8A60-EF4C343C7374}" 17 | EndProject 18 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "nunit.xamarin", "src\nunit.xamarin\nunit.xamarin.csproj", "{A9479AD9-EE64-4590-927C-FFDC13AC7C70}" 19 | EndProject 20 | Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "nunit.runner.tests", "tests\nunit.runner.tests\nunit.runner.tests.shproj", "{AF293652-BAA0-4813-B4F3-2D5A2CDDE0B4}" 21 | EndProject 22 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.runner.tests.Droid", "tests\nunit.runner.tests.Droid\nunit.runner.tests.Droid.csproj", "{FEC118A7-A5B1-4058-898E-2DE513708A07}" 23 | EndProject 24 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.runner.tests.iOS", "tests\nunit.runner.tests.iOS\nunit.runner.tests.iOS.csproj", "{17A2B97C-56EA-40B8-8901-5E0728876657}" 25 | EndProject 26 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.runner.tests.uwp", "tests\nunit.runner.tests.uwp\nunit.runner.tests.uwp.csproj", "{B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}" 27 | EndProject 28 | Global 29 | GlobalSection(SharedMSBuildProjectFiles) = preSolution 30 | tests\nunit.runner.tests\nunit.runner.tests.projitems*{17a2b97c-56ea-40b8-8901-5e0728876657}*SharedItemsImports = 4 31 | tests\nunit.runner.tests\nunit.runner.tests.projitems*{af293652-baa0-4813-b4f3-2d5a2cdde0b4}*SharedItemsImports = 13 32 | tests\nunit.runner.tests\nunit.runner.tests.projitems*{b0040786-1ab0-4fd6-93d2-e5ba330fb4bc}*SharedItemsImports = 4 33 | tests\nunit.runner.tests\nunit.runner.tests.projitems*{fec118a7-a5b1-4058-898e-2de513708a07}*SharedItemsImports = 4 34 | EndGlobalSection 35 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 36 | Ad-Hoc|Any CPU = Ad-Hoc|Any CPU 37 | Ad-Hoc|ARM = Ad-Hoc|ARM 38 | Ad-Hoc|iPhone = Ad-Hoc|iPhone 39 | Ad-Hoc|iPhoneSimulator = Ad-Hoc|iPhoneSimulator 40 | Ad-Hoc|Mixed Platforms = Ad-Hoc|Mixed Platforms 41 | Ad-Hoc|x64 = Ad-Hoc|x64 42 | Ad-Hoc|x86 = Ad-Hoc|x86 43 | AppStore|Any CPU = AppStore|Any CPU 44 | AppStore|ARM = AppStore|ARM 45 | AppStore|iPhone = AppStore|iPhone 46 | AppStore|iPhoneSimulator = AppStore|iPhoneSimulator 47 | AppStore|Mixed Platforms = AppStore|Mixed Platforms 48 | AppStore|x64 = AppStore|x64 49 | AppStore|x86 = AppStore|x86 50 | Debug|Any CPU = Debug|Any CPU 51 | Debug|ARM = Debug|ARM 52 | Debug|iPhone = Debug|iPhone 53 | Debug|iPhoneSimulator = Debug|iPhoneSimulator 54 | Debug|Mixed Platforms = Debug|Mixed Platforms 55 | Debug|x64 = Debug|x64 56 | Debug|x86 = Debug|x86 57 | Release|Any CPU = Release|Any CPU 58 | Release|ARM = Release|ARM 59 | Release|iPhone = Release|iPhone 60 | Release|iPhoneSimulator = Release|iPhoneSimulator 61 | Release|Mixed Platforms = Release|Mixed Platforms 62 | Release|x64 = Release|x64 63 | Release|x86 = Release|x86 64 | EndGlobalSection 65 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 66 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU 67 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU 68 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU 69 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU 70 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU 71 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU 72 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU 73 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU 74 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Ad-Hoc|Mixed Platforms.ActiveCfg = Debug|Any CPU 75 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Ad-Hoc|Mixed Platforms.Build.0 = Debug|Any CPU 76 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU 77 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Ad-Hoc|x64.Build.0 = Debug|Any CPU 78 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU 79 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Ad-Hoc|x86.Build.0 = Debug|Any CPU 80 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU 81 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.AppStore|Any CPU.Build.0 = Debug|Any CPU 82 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.AppStore|ARM.ActiveCfg = Debug|Any CPU 83 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.AppStore|ARM.Build.0 = Debug|Any CPU 84 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.AppStore|iPhone.ActiveCfg = Debug|Any CPU 85 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.AppStore|iPhone.Build.0 = Debug|Any CPU 86 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU 87 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU 88 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.AppStore|Mixed Platforms.ActiveCfg = Debug|Any CPU 89 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.AppStore|Mixed Platforms.Build.0 = Debug|Any CPU 90 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.AppStore|x64.ActiveCfg = Debug|Any CPU 91 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.AppStore|x64.Build.0 = Debug|Any CPU 92 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.AppStore|x86.ActiveCfg = Debug|Any CPU 93 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.AppStore|x86.Build.0 = Debug|Any CPU 94 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 95 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Debug|Any CPU.Build.0 = Debug|Any CPU 96 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Debug|ARM.ActiveCfg = Debug|Any CPU 97 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Debug|ARM.Build.0 = Debug|Any CPU 98 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Debug|iPhone.ActiveCfg = Debug|Any CPU 99 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Debug|iPhone.Build.0 = Debug|Any CPU 100 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU 101 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU 102 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU 103 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU 104 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Debug|x64.ActiveCfg = Debug|Any CPU 105 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Debug|x64.Build.0 = Debug|Any CPU 106 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Debug|x86.ActiveCfg = Debug|Any CPU 107 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Debug|x86.Build.0 = Debug|Any CPU 108 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Release|Any CPU.ActiveCfg = Release|Any CPU 109 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Release|Any CPU.Build.0 = Release|Any CPU 110 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Release|ARM.ActiveCfg = Release|Any CPU 111 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Release|ARM.Build.0 = Release|Any CPU 112 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Release|iPhone.ActiveCfg = Release|Any CPU 113 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Release|iPhone.Build.0 = Release|Any CPU 114 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU 115 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Release|iPhoneSimulator.Build.0 = Release|Any CPU 116 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU 117 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Release|Mixed Platforms.Build.0 = Release|Any CPU 118 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Release|x64.ActiveCfg = Release|Any CPU 119 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Release|x64.Build.0 = Release|Any CPU 120 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Release|x86.ActiveCfg = Release|Any CPU 121 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70}.Release|x86.Build.0 = Release|Any CPU 122 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU 123 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU 124 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Ad-Hoc|Any CPU.Deploy.0 = Release|Any CPU 125 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU 126 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Ad-Hoc|ARM.Build.0 = Release|Any CPU 127 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Ad-Hoc|ARM.Deploy.0 = Release|Any CPU 128 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU 129 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU 130 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Ad-Hoc|iPhone.Deploy.0 = Release|Any CPU 131 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU 132 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU 133 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|Any CPU 134 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|Any CPU 135 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Ad-Hoc|Mixed Platforms.Build.0 = Release|Any CPU 136 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Ad-Hoc|Mixed Platforms.Deploy.0 = Release|Any CPU 137 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU 138 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Ad-Hoc|x64.Build.0 = Release|Any CPU 139 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Ad-Hoc|x64.Deploy.0 = Release|Any CPU 140 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU 141 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Ad-Hoc|x86.Build.0 = Release|Any CPU 142 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Ad-Hoc|x86.Deploy.0 = Release|Any CPU 143 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.AppStore|Any CPU.ActiveCfg = Release|Any CPU 144 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.AppStore|Any CPU.Build.0 = Release|Any CPU 145 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.AppStore|Any CPU.Deploy.0 = Release|Any CPU 146 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.AppStore|ARM.ActiveCfg = Release|Any CPU 147 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.AppStore|ARM.Build.0 = Release|Any CPU 148 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.AppStore|ARM.Deploy.0 = Release|Any CPU 149 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.AppStore|iPhone.ActiveCfg = Release|Any CPU 150 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.AppStore|iPhone.Build.0 = Release|Any CPU 151 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.AppStore|iPhone.Deploy.0 = Release|Any CPU 152 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU 153 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU 154 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.AppStore|iPhoneSimulator.Deploy.0 = Release|Any CPU 155 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU 156 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU 157 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.AppStore|Mixed Platforms.Deploy.0 = Release|Any CPU 158 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.AppStore|x64.ActiveCfg = Release|Any CPU 159 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.AppStore|x64.Build.0 = Release|Any CPU 160 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.AppStore|x64.Deploy.0 = Release|Any CPU 161 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.AppStore|x86.ActiveCfg = Release|Any CPU 162 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.AppStore|x86.Build.0 = Release|Any CPU 163 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.AppStore|x86.Deploy.0 = Release|Any CPU 164 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 165 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Debug|Any CPU.Build.0 = Debug|Any CPU 166 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Debug|Any CPU.Deploy.0 = Debug|Any CPU 167 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Debug|ARM.ActiveCfg = Debug|Any CPU 168 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Debug|ARM.Build.0 = Debug|Any CPU 169 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Debug|ARM.Deploy.0 = Debug|Any CPU 170 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Debug|iPhone.ActiveCfg = Debug|Any CPU 171 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Debug|iPhone.Build.0 = Debug|Any CPU 172 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Debug|iPhone.Deploy.0 = Debug|Any CPU 173 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU 174 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU 175 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU 176 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU 177 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU 178 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Debug|Mixed Platforms.Deploy.0 = Debug|Any CPU 179 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Debug|x64.ActiveCfg = Debug|Any CPU 180 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Debug|x64.Build.0 = Debug|Any CPU 181 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Debug|x64.Deploy.0 = Debug|Any CPU 182 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Debug|x86.ActiveCfg = Debug|Any CPU 183 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Debug|x86.Build.0 = Debug|Any CPU 184 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Debug|x86.Deploy.0 = Debug|Any CPU 185 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Release|Any CPU.ActiveCfg = Release|Any CPU 186 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Release|Any CPU.Build.0 = Release|Any CPU 187 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Release|Any CPU.Deploy.0 = Release|Any CPU 188 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Release|ARM.ActiveCfg = Release|Any CPU 189 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Release|ARM.Build.0 = Release|Any CPU 190 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Release|ARM.Deploy.0 = Release|Any CPU 191 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Release|iPhone.ActiveCfg = Release|Any CPU 192 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Release|iPhone.Build.0 = Release|Any CPU 193 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Release|iPhone.Deploy.0 = Release|Any CPU 194 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU 195 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Release|iPhoneSimulator.Build.0 = Release|Any CPU 196 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU 197 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU 198 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Release|Mixed Platforms.Build.0 = Release|Any CPU 199 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Release|Mixed Platforms.Deploy.0 = Release|Any CPU 200 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Release|x64.ActiveCfg = Release|Any CPU 201 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Release|x64.Build.0 = Release|Any CPU 202 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Release|x64.Deploy.0 = Release|Any CPU 203 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Release|x86.ActiveCfg = Release|Any CPU 204 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Release|x86.Build.0 = Release|Any CPU 205 | {FEC118A7-A5B1-4058-898E-2DE513708A07}.Release|x86.Deploy.0 = Release|Any CPU 206 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhone 207 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Ad-Hoc|ARM.ActiveCfg = Ad-Hoc|iPhone 208 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone 209 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone 210 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator 211 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator 212 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Ad-Hoc|Mixed Platforms.ActiveCfg = Ad-Hoc|iPhone 213 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Ad-Hoc|Mixed Platforms.Build.0 = Ad-Hoc|iPhone 214 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Ad-Hoc|x64.ActiveCfg = Ad-Hoc|iPhone 215 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Ad-Hoc|x86.ActiveCfg = Ad-Hoc|iPhone 216 | {17A2B97C-56EA-40B8-8901-5E0728876657}.AppStore|Any CPU.ActiveCfg = AppStore|iPhone 217 | {17A2B97C-56EA-40B8-8901-5E0728876657}.AppStore|ARM.ActiveCfg = AppStore|iPhone 218 | {17A2B97C-56EA-40B8-8901-5E0728876657}.AppStore|iPhone.ActiveCfg = AppStore|iPhone 219 | {17A2B97C-56EA-40B8-8901-5E0728876657}.AppStore|iPhone.Build.0 = AppStore|iPhone 220 | {17A2B97C-56EA-40B8-8901-5E0728876657}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator 221 | {17A2B97C-56EA-40B8-8901-5E0728876657}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator 222 | {17A2B97C-56EA-40B8-8901-5E0728876657}.AppStore|Mixed Platforms.ActiveCfg = AppStore|iPhone 223 | {17A2B97C-56EA-40B8-8901-5E0728876657}.AppStore|Mixed Platforms.Build.0 = AppStore|iPhone 224 | {17A2B97C-56EA-40B8-8901-5E0728876657}.AppStore|x64.ActiveCfg = AppStore|iPhone 225 | {17A2B97C-56EA-40B8-8901-5E0728876657}.AppStore|x86.ActiveCfg = AppStore|iPhone 226 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Debug|Any CPU.ActiveCfg = Debug|iPhone 227 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Debug|ARM.ActiveCfg = Debug|iPhone 228 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Debug|iPhone.ActiveCfg = Debug|iPhone 229 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Debug|iPhone.Build.0 = Debug|iPhone 230 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator 231 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator 232 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Debug|Mixed Platforms.ActiveCfg = Debug|iPhone 233 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Debug|Mixed Platforms.Build.0 = Debug|iPhone 234 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Debug|x64.ActiveCfg = Debug|iPhone 235 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Debug|x86.ActiveCfg = Debug|iPhone 236 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Release|Any CPU.ActiveCfg = Release|iPhone 237 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Release|ARM.ActiveCfg = Release|iPhone 238 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Release|iPhone.ActiveCfg = Release|iPhone 239 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Release|iPhone.Build.0 = Release|iPhone 240 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator 241 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator 242 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Release|Mixed Platforms.ActiveCfg = Release|iPhone 243 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Release|Mixed Platforms.Build.0 = Release|iPhone 244 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Release|x64.ActiveCfg = Release|iPhone 245 | {17A2B97C-56EA-40B8-8901-5E0728876657}.Release|x86.ActiveCfg = Release|iPhone 246 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Ad-Hoc|Any CPU.ActiveCfg = Release|x86 247 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Ad-Hoc|Any CPU.Build.0 = Release|x86 248 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Ad-Hoc|Any CPU.Deploy.0 = Release|x86 249 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Ad-Hoc|ARM.ActiveCfg = Release|ARM 250 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Ad-Hoc|ARM.Build.0 = Release|ARM 251 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Ad-Hoc|ARM.Deploy.0 = Release|ARM 252 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Ad-Hoc|iPhone.ActiveCfg = Release|x86 253 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Ad-Hoc|iPhone.Build.0 = Release|x86 254 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Ad-Hoc|iPhone.Deploy.0 = Release|x86 255 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|x86 256 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|x86 257 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|x86 258 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|x86 259 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Ad-Hoc|Mixed Platforms.Build.0 = Release|x86 260 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Ad-Hoc|Mixed Platforms.Deploy.0 = Release|x86 261 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Ad-Hoc|x64.ActiveCfg = Release|x64 262 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Ad-Hoc|x64.Build.0 = Release|x64 263 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Ad-Hoc|x64.Deploy.0 = Release|x64 264 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Ad-Hoc|x86.ActiveCfg = Release|x86 265 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Ad-Hoc|x86.Build.0 = Release|x86 266 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Ad-Hoc|x86.Deploy.0 = Release|x86 267 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.AppStore|Any CPU.ActiveCfg = Release|x86 268 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.AppStore|Any CPU.Build.0 = Release|x86 269 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.AppStore|Any CPU.Deploy.0 = Release|x86 270 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.AppStore|ARM.ActiveCfg = Release|ARM 271 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.AppStore|ARM.Build.0 = Release|ARM 272 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.AppStore|ARM.Deploy.0 = Release|ARM 273 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.AppStore|iPhone.ActiveCfg = Release|x86 274 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.AppStore|iPhone.Build.0 = Release|x86 275 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.AppStore|iPhone.Deploy.0 = Release|x86 276 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.AppStore|iPhoneSimulator.ActiveCfg = Release|x86 277 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.AppStore|iPhoneSimulator.Build.0 = Release|x86 278 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.AppStore|iPhoneSimulator.Deploy.0 = Release|x86 279 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.AppStore|Mixed Platforms.ActiveCfg = Release|x86 280 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.AppStore|Mixed Platforms.Build.0 = Release|x86 281 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.AppStore|Mixed Platforms.Deploy.0 = Release|x86 282 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.AppStore|x64.ActiveCfg = Release|x64 283 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.AppStore|x64.Build.0 = Release|x64 284 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.AppStore|x64.Deploy.0 = Release|x64 285 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.AppStore|x86.ActiveCfg = Release|x86 286 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.AppStore|x86.Build.0 = Release|x86 287 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.AppStore|x86.Deploy.0 = Release|x86 288 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Debug|Any CPU.ActiveCfg = Debug|x86 289 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Debug|ARM.ActiveCfg = Debug|ARM 290 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Debug|ARM.Build.0 = Debug|ARM 291 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Debug|ARM.Deploy.0 = Debug|ARM 292 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Debug|iPhone.ActiveCfg = Debug|x86 293 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Debug|iPhoneSimulator.ActiveCfg = Debug|x86 294 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 295 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Debug|Mixed Platforms.Build.0 = Debug|x86 296 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Debug|Mixed Platforms.Deploy.0 = Debug|x86 297 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Debug|x64.ActiveCfg = Debug|x64 298 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Debug|x64.Build.0 = Debug|x64 299 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Debug|x64.Deploy.0 = Debug|x64 300 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Debug|x86.ActiveCfg = Debug|x86 301 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Debug|x86.Build.0 = Debug|x86 302 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Debug|x86.Deploy.0 = Debug|x86 303 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Release|Any CPU.ActiveCfg = Release|x86 304 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Release|ARM.ActiveCfg = Release|ARM 305 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Release|ARM.Build.0 = Release|ARM 306 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Release|ARM.Deploy.0 = Release|ARM 307 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Release|iPhone.ActiveCfg = Release|x86 308 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Release|iPhoneSimulator.ActiveCfg = Release|x86 309 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Release|Mixed Platforms.ActiveCfg = Release|x86 310 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Release|Mixed Platforms.Build.0 = Release|x86 311 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Release|Mixed Platforms.Deploy.0 = Release|x86 312 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Release|x64.ActiveCfg = Release|x64 313 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Release|x64.Build.0 = Release|x64 314 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Release|x64.Deploy.0 = Release|x64 315 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Release|x86.ActiveCfg = Release|x86 316 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Release|x86.Build.0 = Release|x86 317 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC}.Release|x86.Deploy.0 = Release|x86 318 | EndGlobalSection 319 | GlobalSection(SolutionProperties) = preSolution 320 | HideSolutionNode = FALSE 321 | EndGlobalSection 322 | GlobalSection(NestedProjects) = preSolution 323 | {A9479AD9-EE64-4590-927C-FFDC13AC7C70} = {B3AE763A-DC9C-4F5D-B5F0-97A1B10D147B} 324 | {AF293652-BAA0-4813-B4F3-2D5A2CDDE0B4} = {040381B1-C9E8-4D7C-8A60-EF4C343C7374} 325 | {FEC118A7-A5B1-4058-898E-2DE513708A07} = {040381B1-C9E8-4D7C-8A60-EF4C343C7374} 326 | {17A2B97C-56EA-40B8-8901-5E0728876657} = {040381B1-C9E8-4D7C-8A60-EF4C343C7374} 327 | {B0040786-1AB0-4FD6-93D2-E5BA330FB4BC} = {040381B1-C9E8-4D7C-8A60-EF4C343C7374} 328 | EndGlobalSection 329 | GlobalSection(ExtensibilityGlobals) = postSolution 330 | SolutionGuid = {3AEEC270-D641-4F52-BEB0-DAAF90328CED} 331 | EndGlobalSection 332 | EndGlobal 333 | --------------------------------------------------------------------------------