Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add UI test for ComboBox
  • Loading branch information
nicolaihenriksen committed Feb 17, 2023
commit 3662cb07a35b48a865ece87a88df006c378fbe24
91 changes: 91 additions & 0 deletions MaterialDesignThemes.UITests/WPF/ComboBoxes/ComboBoxTests.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.ComponentModel;
using MaterialDesignThemes.UITests.WPF.TextBoxes;

namespace MaterialDesignThemes.UITests.WPF.ComboBoxes;

Expand Down Expand Up @@ -166,4 +167,94 @@ public async Task OnEditableComboBox_ClickInTextArea_FocusesTextBox()

recorder.Success();
}

[Theory]
[InlineData("MaterialDesignFloatingHintComboBox", null)]
[InlineData("MaterialDesignFloatingHintComboBox", 5)]
[InlineData("MaterialDesignFloatingHintComboBox", 20)]
[InlineData("MaterialDesignFilledComboBox", null)]
[InlineData("MaterialDesignFilledComboBox", 5)]
[InlineData("MaterialDesignFilledComboBox", 20)]
[InlineData("MaterialDesignOutlinedComboBox", null)]
[InlineData("MaterialDesignOutlinedComboBox", 5)]
[InlineData("MaterialDesignOutlinedComboBox", 20)]
public async Task ComboBox_WithHintAndHelperText_RespectsPadding(string styleName, int? padding)
{
await using var recorder = new TestRecorder(App);

// FIXME: Tolerance needed because TextFieldAssist.TextBoxViewMargin is in play and slightly modifies the hint text placement in certain cases.
double tolerance = 1.5;

string styleAttribute = $"Style=\"{{StaticResource {styleName}}}\"";
string paddingAttribute = padding.HasValue ? $"Padding=\"{padding.Value}\"" : string.Empty;

var comboBox = await LoadXaml<ComboBox>($@"
<ComboBox {styleAttribute} {paddingAttribute}
materialDesign:HintAssist.Hint=""Hint text""
materialDesign:HintAssist.HelperText=""Helper text""
Width=""200"" VerticalAlignment=""Center"" HorizontalAlignment=""Center"" />
");

var contentHost = await comboBox.GetElement<ScrollViewer>("PART_ContentHost");
var hint = await comboBox.GetElement<SmartHint>("Hint");
var helperText = await comboBox.GetElement<TextBlock>("HelperTextTextBlock");

Rect? contentHostCoordinates = await contentHost.GetCoordinates();
Rect? hintCoordinates = await hint.GetCoordinates();
Rect? helperTextCoordinates = await helperText.GetCoordinates();

Assert.InRange(Math.Abs(contentHostCoordinates.Value.Left - hintCoordinates.Value.Left), 0, tolerance);
Assert.InRange(Math.Abs(contentHostCoordinates.Value.Left - helperTextCoordinates.Value.Left), 0, tolerance);

recorder.Success();
}

[Theory]
[InlineData("MaterialDesignFloatingHintComboBox", null)]
[InlineData("MaterialDesignFloatingHintComboBox", 5)]
[InlineData("MaterialDesignFloatingHintComboBox", 20)]
[InlineData("MaterialDesignFilledComboBox", null)]
[InlineData("MaterialDesignFilledComboBox", 5)]
[InlineData("MaterialDesignFilledComboBox", 20)]
[InlineData("MaterialDesignOutlinedComboBox", null)]
[InlineData("MaterialDesignOutlinedComboBox", 5)]
[InlineData("MaterialDesignOutlinedComboBox", 20)]
public async Task ComboBox_WithHintAndValidationError_RespectsPadding(string styleName, int? padding)
{
await using var recorder = new TestRecorder(App);

// FIXME: Tolerance needed because TextFieldAssist.TextBoxViewMargin is in play and slightly modifies the hint text placement in certain cases.
double tolerance = 1.5;

string styleAttribute = $"Style=\"{{StaticResource {styleName}}}\"";
string paddingAttribute = padding.HasValue ? $"Padding=\"{padding.Value}\"" : string.Empty;

var comboBox = await LoadXaml<ComboBox>($@"
<ComboBox {styleAttribute} {paddingAttribute}
materialDesign:HintAssist.Hint=""Hint text""
materialDesign:HintAssist.HelperText=""Helper text""
Width=""200"" VerticalAlignment=""Center"" HorizontalAlignment=""Center"">
<ComboBox.Text>
<Binding RelativeSource=""{{RelativeSource Self}}"" Path=""Tag"" UpdateSourceTrigger=""PropertyChanged"">
<Binding.ValidationRules>
<local:NotEmptyValidationRule ValidatesOnTargetUpdated=""True""/>
</Binding.ValidationRules>
</Binding>
</ComboBox.Text>
</ComboBox>
", ("local", typeof(NotEmptyValidationRule)));

var contentHost = await comboBox.GetElement<ScrollViewer>("PART_ContentHost");
var hint = await comboBox.GetElement<SmartHint>("Hint");
var errorViewer = await comboBox.GetElement<Border>("DefaultErrorViewer");

Rect? contentHostCoordinates = await contentHost.GetCoordinates();
Rect? hintCoordinates = await hint.GetCoordinates();
Rect? errorViewerCoordinates = await errorViewer.GetCoordinates();

Assert.InRange(Math.Abs(contentHostCoordinates.Value.Left - hintCoordinates.Value.Left), 0, tolerance);
Assert.InRange(Math.Abs(contentHostCoordinates.Value.Left - errorViewerCoordinates.Value.Left), 0, tolerance);

recorder.Success();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
<converters:FloatingHintOffsetCalculationConverter x:Key="FloatingHintOffsetCalculationConverter" />
<converters:ComboBoxClearButtonMarginConverter x:Key="ComboBoxClearButtonMarginConverter" />
<converters:DoubleToThicknessConverter x:Key="DoubleToThicknessConverter" />
<converters:ThicknessCloneConverter x:Key="HelperTextMarginConverter" CloneEdges="Left" />

<system:Double x:Key="PopupContentPresenterExtend">4</system:Double>
<system:Double x:Key="PopupTopBottomMargin">8</system:Double>
Expand Down Expand Up @@ -363,7 +364,6 @@

<wpf:SmartHint x:Name="Hint"
Grid.Column="1"
Margin="{TemplateBinding wpf:TextFieldAssist.TextBoxViewMargin}"
FloatingOffset="{TemplateBinding wpf:HintAssist.FloatingOffset}"
FloatingScale="{TemplateBinding wpf:HintAssist.FloatingScale}"
FontFamily="{TemplateBinding wpf:HintAssist.FontFamily}"
Expand Down Expand Up @@ -400,8 +400,8 @@
CornerRadius="{TemplateBinding wpf:TextFieldAssist.UnderlineCornerRadius}"
IsActive="{Binding ElementName=PART_EditableTextBox, Path=IsKeyboardFocused}"
Visibility="{TemplateBinding wpf:TextFieldAssist.DecorationVisibility}" />
<Canvas x:Name="HelperTextWrapper" VerticalAlignment="Bottom">
<TextBlock Canvas.Top="2"
<Canvas x:Name="HelperTextWrapper" VerticalAlignment="Bottom" Margin="{TemplateBinding Padding, Converter={StaticResource HelperTextMarginConverter}}">
<TextBlock x:Name="HelperTextTextBlock" Canvas.Top="2"
MaxWidth="{Binding ActualWidth, ElementName=toggleButton}"
FontSize="{TemplateBinding wpf:HintAssist.HelperTextFontSize}"
Opacity="{TemplateBinding wpf:HintAssist.HintOpacity}"
Expand Down Expand Up @@ -480,11 +480,7 @@
</Grid>
</AdornerDecorator>
<ControlTemplate.Triggers>
<Trigger Property="wpf:TextFieldAssist.HasFilledTextField" Value="True">
<Setter TargetName="HelperTextWrapper" Property="Margin" Value="16,0,0,0" />
</Trigger>
<Trigger Property="wpf:TextFieldAssist.HasOutlinedTextField" Value="True">
<Setter TargetName="HelperTextWrapper" Property="Margin" Value="16,0,0,0" />
<Setter TargetName="Hint" Property="FloatingOffset">
<Setter.Value>
<MultiBinding Converter="{StaticResource FloatingHintOffsetCalculationConverter}">
Expand Down