using UnitTestSharp; namespace Glass.UnitTests { public class RadioButtonTests : TestFixture { public class CheckedTests : TestFixture { public void SettingTrueSelectsThisButtonInItsGroup() { var group = new RadioGroup(); var button = new RadioButton { Group = group }; button.Checked = true; CheckEqual(button, group.Selected); } public void SettingTrueUnchecksThePreviouslySelectedSibling() { var group = new RadioGroup(); var first = new RadioButton { Group = group }; var second = new RadioButton { Group = group }; first.Checked = true; second.Checked = true; CheckFalse(first.Checked); CheckEqual(second, group.Selected); } public void SwitchingBackAndForthBetweenTwoGroupedButtonsSettles() { var group = new RadioGroup(); var first = new RadioButton { Group = group }; var second = new RadioButton { Group = group }; first.Checked = true; second.Checked = true; first.Checked = true; Check(first.Checked); CheckFalse(second.Checked); CheckEqual(first, group.Selected); } public void SettingFalseOnTheSelectedButtonClearsTheGroup() { var group = new RadioGroup(); var button = new RadioButton { Group = group, Checked = true }; button.Checked = false; CheckNull(group.Selected); } public void SettingFalseOnAnUnselectedButtonDoesNotDisturbTheGroup() { var group = new RadioGroup(); var first = new RadioButton { Group = group }; var second = new RadioButton { Group = group }; first.Checked = true; second.Checked = false; CheckEqual(first, group.Selected); } public void WithNoGroupBehavesLikeAPlainCheckbox() { var button = new RadioButton(); button.Checked = true; Check(button.Checked); } } public class ToggleTests : TestFixture { public void OnAnUncheckedButtonChecksIt() { var button = new RadioButton(); button.Toggle(); Check(button.Checked); } public void OnACheckedButtonDoesNothing() { var button = new RadioButton { Checked = true }; button.Toggle(); Check(button.Checked); } public void OnACheckedButtonRaisesNothing() { var button = new RadioButton { Checked = true }; bool raised = false; button.OnCheckedChanged +=_ => raised = true; button.Toggle(); CheckFalse(raised); } } public class ClickTests : TestFixture { public void OnTheActiveButtonLeavesItChecked() { var button = new RadioButton { Checked = true }; button.Click(new MouseState(), MouseButtonFlags.Left); Check(button.Checked); } public void SwitchingUnchecksTheOldSelection() { var group = new RadioGroup(); var first = new RadioButton { Group = group, Checked = true }; var second = new RadioButton { Group = group }; second.Click(new MouseState(), MouseButtonFlags.Left); CheckFalse(first.Checked); Check(second.Checked); } public void OnClickStillFires() { var button = new RadioButton(); bool clicked = false; button.OnClick += (in MouseState _, MouseButtonFlags __) => clicked = true; button.Click(new MouseState(), MouseButtonFlags.Left); Check(clicked); } public void DisabledDoesNothing() { var button = new RadioButton { Enabled = false }; button.Click(new MouseState(), MouseButtonFlags.Left); CheckFalse(button.Checked); } } public class GroupAssignmentTests : TestFixture { public void AssigningAGroupWhileCheckedSelectsThisButton() { var button = new RadioButton { Checked = true }; var group = new RadioGroup(); button.Group = group; CheckEqual(button, group.Selected); } public void AssigningAGroupWhileUncheckedDoesNotSelectAnything() { var button = new RadioButton(); var group = new RadioGroup(); button.Group = group; CheckNull(group.Selected); } public void LastOfSeveralPreCheckedButtonsAssignedWins() { var group = new RadioGroup(); var first = new RadioButton { Checked = true }; var second = new RadioButton { Checked = true }; first.Group = group; second.Group = group; CheckEqual(second, group.Selected); CheckFalse(first.Checked); } public void ReassigningToANullGroupClearsTheOldGroupsSelected() { var group = new RadioGroup(); var button = new RadioButton { Group = group, Checked = true }; button.Group = null; CheckNull(group.Selected); } public void ReassigningToANullGroupLeavesTheButtonChecked() { var group = new RadioGroup(); var button = new RadioButton { Group = group, Checked = true }; button.Group = null; Check(button.Checked); } public void ReassigningToADifferentGroupMovesTheSelectionThereAndStaysChecked() { var oldGroup = new RadioGroup(); var newGroup = new RadioGroup(); var button = new RadioButton { Group = oldGroup, Checked = true }; button.Group = newGroup; CheckNull(oldGroup.Selected); CheckEqual(button, newGroup.Selected); Check(button.Checked); } public void ReassigningAnUncheckedButtonDoesNotDisturbTheOldGroupsSelection() { var group = new RadioGroup(); var selected = new RadioButton { Group = group, Checked = true }; var spare = new RadioButton { Group = group }; spare.Group = null; CheckEqual(selected, group.Selected); } public void ReassigningToTheSameGroupIsANoOp() { var group = new RadioGroup(); var button = new RadioButton { Group = group, Checked = true }; int raiseCount = 0; group.OnSelectionChanged += _ => ++raiseCount; button.Group = group; CheckEqual(0, raiseCount); } } } }