using System; using NUnit.Framework; namespace Xamarin.Forms.Core.UnitTests { [TestFixture] public class CommandTests : BaseTestFixture { [Test] public void Constructor () { var cmd = new Command (() => { }); Assert.True (cmd.CanExecute (null)); } [Test] public void ThrowsWithNullConstructor () { Assert.Throws (() => new Command ((Action)null)); } [Test] public void ThrowsWithNullParameterizedConstructor () { Assert.Throws (() => new Command ((Action)null)); } [Test] public void ThrowsWithNullCanExecute () { Assert.Throws (() => new Command (() => { }, null)); } [Test] public void ThrowsWithNullParameterizedCanExecute () { Assert.Throws (() => new Command (o => { }, null)); } [Test] public void ThrowsWithNullExecuteValidCanExecute () { Assert.Throws (() => new Command (null, () => true)); } [Test] public void Execute () { bool executed = false; var cmd = new Command (() => executed = true); cmd.Execute (null); Assert.True (executed); } [Test] public void ExecuteParameterized () { object executed = null; var cmd = new Command (o => executed = o); var expected = new object (); cmd.Execute (expected); Assert.AreEqual (expected, executed); } [Test] public void ExecuteWithCanExecute () { bool executed = false; var cmd = new Command (() => executed = true, () => true); cmd.Execute (null); Assert.True (executed); } [Test] public void CanExecute ([Values (true, false)] bool expected) { bool canExecuteRan = false; var cmd = new Command (() => { }, () => { canExecuteRan = true; return expected; }); Assert.AreEqual(expected, cmd.CanExecute (null)); Assert.True (canExecuteRan); } [Test] public void ChangeCanExecute () { bool signaled = false; var cmd = new Command (() => { }); cmd.CanExecuteChanged += (sender, args) => signaled = true; cmd.ChangeCanExecute (); Assert.True (signaled); } [Test] public void GenericThrowsWithNullExecute () { Assert.Throws (() => new Command (null)); } [Test] public void GenericThrowsWithNullExecuteAndCanExecuteValid () { Assert.Throws (() => new Command (null, s => true)); } [Test] public void GenericThrowsWithValidExecuteAndCanExecuteNull () { Assert.Throws (() => new Command (s => { }, null)); } [Test] public void GenericExecute () { string result = null; var cmd = new Command (s => result = s); cmd.Execute ("Foo"); Assert.AreEqual ("Foo", result); } [Test] public void GenericExecuteWithCanExecute () { string result = null; var cmd = new Command (s => result = s, s => true); cmd.Execute ("Foo"); Assert.AreEqual ("Foo", result); } [Test] public void GenericCanExecute ([Values (true, false)] bool expected) { string result = null; var cmd = new Command (s => { }, s => { result = s; return expected; }); Assert.AreEqual (expected, cmd.CanExecute ("Foo")); Assert.AreEqual ("Foo", result); } class FakeParentContext { } // ReSharper disable once ClassNeverInstantiated.Local class FakeChildContext { } [Test] public void CanExecuteReturnsFalseIfParameterIsWrongReferenceType() { var command = new Command(context => { }, context => true); Assert.IsFalse(command.CanExecute(new FakeParentContext()), "the parameter is of the wrong type"); } [Test] public void CanExecuteReturnsFalseIfParameterIsWrongValueType() { var command = new Command(context => { }, context => true); Assert.IsFalse(command.CanExecute(10.5), "the parameter is of the wrong type"); } [Test] public void CanExecuteUsesParameterIfReferenceTypeAndSetToNull() { var command = new Command(context => { }, context => true); Assert.IsTrue(command.CanExecute(null), "null is a valid value for a reference type"); } [Test] public void CanExecuteUsesParameterIfNullableAndSetToNull() { var command = new Command(context => { }, context => true); Assert.IsTrue(command.CanExecute(null), "null is a valid value for a Nullable type"); } [Test] public void CanExecuteIgnoresParameterIfValueTypeAndSetToNull() { var command = new Command(context => { }, context => true); Assert.IsFalse(command.CanExecute(null), "null is not a valid valid for int"); } [Test] public void ExecuteDoesNotRunIfParameterIsWrongReferenceType() { int executions = 0; var command = new Command(context => executions += 1); Assert.DoesNotThrow(() => command.Execute(new FakeParentContext()), "the command should not execute, so no exception should be thrown"); Assert.IsTrue(executions == 0, "the command should not have executed"); } [Test] public void ExecuteDoesNotRunIfParameterIsWrongValueType() { int executions = 0; var command = new Command(context => executions += 1); Assert.DoesNotThrow(() => command.Execute(10.5), "the command should not execute, so no exception should be thrown"); Assert.IsTrue(executions == 0, "the command should not have executed"); } [Test] public void ExecuteRunsIfReferenceTypeAndSetToNull() { int executions = 0; var command = new Command(context => executions += 1); Assert.DoesNotThrow(() => command.Execute(null), "null is a valid value for a reference type"); Assert.IsTrue(executions == 1, "the command should have executed"); } [Test] public void ExecuteRunsIfNullableAndSetToNull() { int executions = 0; var command = new Command(context => executions += 1); Assert.DoesNotThrow(() => command.Execute(null), "null is a valid value for a Nullable type"); Assert.IsTrue(executions == 1, "the command should have executed"); } [Test] public void ExecuteDoesNotRunIfValueTypeAndSetToNull() { int executions = 0; var command = new Command(context => executions += 1); Assert.DoesNotThrow(() => command.Execute(null), "null is not a valid value for int"); Assert.IsTrue(executions == 0, "the command should not have executed"); } } }