Merge remote-tracking branch 'upstream/master' into settings

This commit is contained in:
Eric Tian 2020-08-28 16:22:40 -07:00
commit 9f2d3e7949
28 changed files with 227 additions and 114 deletions

View file

@ -6,11 +6,11 @@
trigger:
- master
- servicing/*
- release/*
- feature/*
pr:
- master
- servicing/*
- release/*
- feature/*
name: 0.$(Date:yyMM).$(DayOfMonth)$(Rev:rr).0

View file

@ -27,7 +27,7 @@ jobs:
inputs:
command: download
downloadDirectory: $(Build.SourcesDirectory)
vstsFeed: WindowsApps
vstsFeed: WindowsInboxApps
vstsFeedPackage: calculator-internals
vstsPackageVersion: 0.0.45

View file

@ -78,7 +78,7 @@ jobs:
inputs:
command: download
downloadDirectory: $(Build.SourcesDirectory)
vstsFeed: WindowsApps
vstsFeed: WindowsInboxApps
vstsFeedPackage: calculator-internals
vstsPackageVersion: 0.0.45

View file

@ -75,7 +75,7 @@ void ApplicationViewModel::Categories::set(IObservableVector<NavCategoryGroup ^>
void ApplicationViewModel::Initialize(ViewMode mode)
{
if (!NavCategory::IsValidViewMode(mode))
if (!NavCategory::IsValidViewMode(mode) || !NavCategory::IsViewModeEnabled(mode))
{
mode = ViewMode::Standard;
}

View file

@ -361,6 +361,14 @@ bool NavCategory::IsValidViewMode(ViewMode mode)
return iter != s_categoryManifest.end();
}
bool NavCategory::IsViewModeEnabled(ViewMode mode)
{
auto iter =
find_if(begin(s_categoryManifest), end(s_categoryManifest), [mode](const NavCategoryInitializer& initializer) { return initializer.viewMode == mode && initializer.isEnabled; });
return iter != s_categoryManifest.end();
}
bool NavCategory::IsCalculatorViewMode(ViewMode mode)
{
// Historically, Calculator modes are Standard, Scientific, and Programmer.

View file

@ -135,6 +135,7 @@ namespace CalculatorApp
static ViewMode GetViewModeForFriendlyName(Platform::String ^ name);
static bool IsValidViewMode(ViewMode mode);
static bool IsViewModeEnabled(ViewMode mode);
static bool IsCalculatorViewMode(ViewMode mode);
static bool IsGraphingCalculatorViewMode(ViewMode mode);
static bool IsDateCalculatorViewMode(ViewMode mode);

View file

@ -9,7 +9,7 @@ namespace CalculatorApp
{
namespace ViewModel
{
[Windows::UI::Xaml::Data::Bindable] public ref class HistoryItemViewModel sealed : Windows::UI::Xaml::Data::ICustomPropertyProvider
[Windows::UI::Xaml::Data::Bindable] public ref class HistoryItemViewModel sealed
{
internal :
@ -42,23 +42,6 @@ namespace CalculatorApp
property Platform::String
^ AccResult { Platform::String ^ get() { return m_accResult; } }
virtual Windows::UI::Xaml::Data::ICustomProperty
^ GetCustomProperty(Platform::String ^ name) { return nullptr; }
virtual Windows::UI::Xaml::Data::ICustomProperty
^ GetIndexedProperty(Platform::String ^ name, Windows::UI::Xaml::Interop::TypeName type) { return nullptr; }
virtual property Windows::UI::Xaml::Interop::TypeName Type
{
Windows::UI::Xaml::Interop::TypeName get()
{
return this->GetType();
}
}
virtual Platform::String
^ GetStringRepresentation() { return m_accExpression + " " + m_accResult; }
private : static Platform::String
^ GetAccessibleExpressionFromTokens(
_In_ std::shared_ptr<std::vector<std::pair<std::wstring, int>>> const& spTokens,

View file

@ -14,8 +14,7 @@ namespace CalculatorApp
/// <summary>
/// Model representation of a single item in the Memory list
/// </summary>
[Windows::UI::Xaml::Data::Bindable] public ref class MemoryItemViewModel sealed : public Windows::UI::Xaml::Data::INotifyPropertyChanged,
Windows::UI::Xaml::Data::ICustomPropertyProvider
[Windows::UI::Xaml::Data::Bindable] public ref class MemoryItemViewModel sealed : public Windows::UI::Xaml::Data::INotifyPropertyChanged
{
public:
MemoryItemViewModel(StandardCalculatorViewModel ^ calcVM)
@ -27,23 +26,6 @@ namespace CalculatorApp
OBSERVABLE_PROPERTY_RW(int, Position);
OBSERVABLE_PROPERTY_RW(Platform::String ^, Value);
virtual Windows::UI::Xaml::Data::ICustomProperty
^ GetCustomProperty(Platform::String ^ name) { return nullptr; }
virtual Windows::UI::Xaml::Data::ICustomProperty
^ GetIndexedProperty(Platform::String ^ name, Windows::UI::Xaml::Interop::TypeName type) { return nullptr; }
virtual property Windows::UI::Xaml::Interop::TypeName Type
{
Windows::UI::Xaml::Interop::TypeName get()
{
return this->GetType();
}
}
virtual Platform::String
^ GetStringRepresentation() { return Value; }
void Clear();
void MemoryAdd();
void MemorySubtract();

View file

@ -132,7 +132,7 @@ StandardCalculatorViewModel::StandardCalculatorViewModel()
IsOperandEnabled = true;
IsNegateEnabled = true;
IsDecimalEnabled = true;
AreProgrammerRadixOperatorsEnabled = false;
AreProgrammerRadixOperatorsVisible = false;
}
String ^ StandardCalculatorViewModel::LocalizeDisplayValue(_In_ wstring const& displayValue)

View file

@ -76,7 +76,7 @@ namespace CalculatorApp
OBSERVABLE_PROPERTY_R(CalculatorApp::Common::NumberBase, CurrentRadixType);
OBSERVABLE_PROPERTY_R(bool, AreTokensUpdated);
OBSERVABLE_PROPERTY_R(bool, AreAlwaysOnTopResultsUpdated);
OBSERVABLE_PROPERTY_R(bool, AreProgrammerRadixOperatorsEnabled);
OBSERVABLE_PROPERTY_R(bool, AreProgrammerRadixOperatorsVisible);
OBSERVABLE_PROPERTY_R(bool, IsInputEmpty);
OBSERVABLE_PROPERTY_R(CalculatorApp::Common::Automation::NarratorAnnouncement ^, Announcement);
OBSERVABLE_PROPERTY_R(unsigned int, OpenParenthesisCount);
@ -103,7 +103,7 @@ namespace CalculatorApp
{
m_isBitFlipChecked = value;
IsBinaryBitFlippingEnabled = IsProgrammer && m_isBitFlipChecked;
AreProgrammerRadixOperatorsEnabled = IsProgrammer && !m_isBitFlipChecked;
AreProgrammerRadixOperatorsVisible = IsProgrammer && !m_isBitFlipChecked;
RaisePropertyChanged(L"IsBitFlipChecked");
}
}
@ -178,7 +178,7 @@ namespace CalculatorApp
IsBitFlipChecked = false;
}
IsBinaryBitFlippingEnabled = m_isProgrammer && IsBitFlipChecked;
AreProgrammerRadixOperatorsEnabled = m_isProgrammer && !IsBitFlipChecked;
AreProgrammerRadixOperatorsVisible = m_isProgrammer && !IsBitFlipChecked;
if (value)
{
IsStandard = false;

View file

@ -162,6 +162,10 @@ task<void> App::SetupJumpList()
for (NavCategory ^ option : calculatorOptions->Categories)
{
if (!option->IsEnabled)
{
continue;
}
ViewMode mode = option->Mode;
auto item = JumpListItem::CreateWithArguments(((int)mode).ToString(), L"ms-resource:///Resources/" + NavCategory::GetNameResourceKey(mode));
item->Description = L"ms-resource:///Resources/" + NavCategory::GetNameResourceKey(mode);

View file

@ -135,7 +135,7 @@
</ImportGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
<ClCompile>
<AdditionalOptions>/bigobj /await /std:c++17 /utf-8</AdditionalOptions>
<AdditionalOptions>/bigobj /await /std:c++17 /utf-8 %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>4453;28204</DisableSpecificWarnings>
<AdditionalIncludeDirectories>$(SolutionDir)..\src\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<WarningLevel>Level4</WarningLevel>
@ -144,7 +144,7 @@
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
<ClCompile>
<AdditionalOptions>/bigobj /await /std:c++17 /utf-8</AdditionalOptions>
<AdditionalOptions>/bigobj /await /std:c++17 /utf-8 %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>4453;28204</DisableSpecificWarnings>
<AdditionalIncludeDirectories>$(SolutionDir)..\src\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<WarningLevel>Level4</WarningLevel>
@ -177,7 +177,7 @@
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<AdditionalOptions>/bigobj /await /std:c++17 /utf-8</AdditionalOptions>
<AdditionalOptions>/bigobj /await /std:c++17 /utf-8 %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>4453;28204</DisableSpecificWarnings>
<AdditionalIncludeDirectories>$(SolutionDir)..\src\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<WarningLevel>Level4</WarningLevel>
@ -198,7 +198,7 @@
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<AdditionalOptions>/bigobj /await /std:c++17 /utf-8</AdditionalOptions>
<AdditionalOptions>/bigobj /await /std:c++17 /utf-8 %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>4453;28204</DisableSpecificWarnings>
<AdditionalIncludeDirectories>$(SolutionDir)..\src\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<WarningLevel>Level4</WarningLevel>

View file

@ -346,13 +346,13 @@
<Flyout x:Name="BitShiftFlyout"
Windows10version1809:AreOpenCloseAnimationsEnabled="False"
FlyoutPresenterStyle="{ThemeResource OperatorPanelFlyoutStyle}"
Placement="Bottom">
Placement="Bottom"
Opened="BitShiftFlyout_Opened">
<StackPanel MaxWidth="192" Padding="12">
<RadioButton x:Name="ArithmeticShiftButton"
x:Uid="arithmeticShiftButton"
AutomationProperties.AutomationId="arithmeticShiftButton"
Checked="BitshiftFlyout_Checked"
IsChecked="True"/>
Checked="BitshiftFlyout_Checked"/>
<RadioButton x:Name="LogicalShiftButton"
x:Uid="logicalShiftButton"
AutomationProperties.AutomationId="logicalShiftButton"

View file

@ -47,10 +47,31 @@ void CalculatorProgrammerRadixOperators::FlyoutButton_Clicked(_In_ Platform::Obj
void CalculatorProgrammerRadixOperators::checkDefaultBitShift()
{
this->ArithmeticShiftButton->IsChecked = true;
LoadDeferredLoadButtons();
if (IsButtonLoaded())
{
return;
}
void CalculatorProgrammerRadixOperators::BitshiftFlyout_Checked(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e)
CollapseBitshiftButtons();
m_selectedShiftButtonMode = BitShiftMode::Arithmetic;
LshButton->Visibility = ::Visibility::Visible;
RshButton->Visibility = ::Visibility::Visible;
LshButton->IsEnabled = true;
RshButton->IsEnabled = true;
}
bool CalculatorApp::CalculatorProgrammerRadixOperators::IsButtonLoaded()
{
// Since arithmeticShiftButton defaults to IsChecked = true, this event an fire before we can load the deferred loaded controls. If that is the case, just
// return and do nothing.
return RolButton == nullptr || RorButton == nullptr || RolCarryButton == nullptr || RorCarryButton == nullptr || LshLogicalButton == nullptr
|| RshLogicalButton == nullptr;
}
void CalculatorApp::CalculatorProgrammerRadixOperators::LoadDeferredLoadButtons()
{
// Load deferred load buttons
if (RolButton == nullptr)
@ -62,11 +83,14 @@ void CalculatorProgrammerRadixOperators::BitshiftFlyout_Checked(Platform::Object
FindName("LshLogicalButton");
FindName("RshLogicalButton");
}
}
// Since arithmeticShiftButton defaults to IsChecked = true, this event an fire before we can load the deferred loaded controls. If that is the case, just
// return and do nothing.
if (RolButton == nullptr || RorButton == nullptr || RolCarryButton == nullptr || RorCarryButton == nullptr || LshLogicalButton == nullptr
|| RshLogicalButton == nullptr)
void CalculatorProgrammerRadixOperators::BitshiftFlyout_Checked(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e)
{
// Load deferred load buttons
LoadDeferredLoadButtons();
if (IsButtonLoaded())
{
return;
}
@ -75,6 +99,7 @@ void CalculatorProgrammerRadixOperators::BitshiftFlyout_Checked(Platform::Object
auto radioButton = static_cast<RadioButton ^>(sender);
Platform::String ^ announcementString = L"";
BitShiftMode selectedButtonMode = m_selectedShiftButtonMode;
if (radioButton == ArithmeticShiftButton)
{
@ -83,6 +108,7 @@ void CalculatorProgrammerRadixOperators::BitshiftFlyout_Checked(Platform::Object
LshButton->IsEnabled = true;
RshButton->IsEnabled = true;
announcementString = m_arithmeticShiftButtonContent;
selectedButtonMode = BitShiftMode::Arithmetic;
}
else if (radioButton == LogicalShiftButton)
{
@ -91,6 +117,7 @@ void CalculatorProgrammerRadixOperators::BitshiftFlyout_Checked(Platform::Object
LshLogicalButton->IsEnabled = true;
RshLogicalButton->IsEnabled = true;
announcementString = m_logicalShiftButtonContent;
selectedButtonMode = BitShiftMode::LogicalShift;
}
else if (radioButton == RotateCircularButton)
{
@ -99,6 +126,7 @@ void CalculatorProgrammerRadixOperators::BitshiftFlyout_Checked(Platform::Object
RolButton->IsEnabled = true;
RorButton->IsEnabled = true;
announcementString = m_rotateCircularButtonContent;
selectedButtonMode = BitShiftMode::RotateCircular;
}
else if (radioButton == RotateCarryShiftButton)
{
@ -107,9 +135,15 @@ void CalculatorProgrammerRadixOperators::BitshiftFlyout_Checked(Platform::Object
RolCarryButton->IsEnabled = true;
RorCarryButton->IsEnabled = true;
announcementString = m_rotateCarryShiftButtonContent;
selectedButtonMode = BitShiftMode::RotateCarry;
}
if (selectedButtonMode != m_selectedShiftButtonMode)
{
this->BitShiftFlyout->Hide();
m_selectedShiftButtonMode = selectedButtonMode;
}
Model->SetBitshiftRadioButtonCheckedAnnouncement(announcementString);
}
@ -176,3 +210,23 @@ void CalculatorProgrammerRadixOperators::ClearButton_LostFocus(Object ^ sender,
ClearEntryButton->Focus(::FocusState::Programmatic);
}
}
void CalculatorApp::CalculatorProgrammerRadixOperators::BitShiftFlyout_Opened(Platform::Object ^ sender, Platform::Object ^ e)
{
if (m_selectedShiftButtonMode == BitShiftMode::Arithmetic)
{
ArithmeticShiftButton->IsChecked = true;
}
else if (m_selectedShiftButtonMode == BitShiftMode::LogicalShift)
{
LogicalShiftButton->IsChecked = true;
}
else if (m_selectedShiftButtonMode == BitShiftMode::RotateCircular)
{
RotateCircularButton->IsChecked = true;
}
else if (m_selectedShiftButtonMode == BitShiftMode::RotateCarry)
{
RotateCarryShiftButton->IsChecked = true;
}
}

View file

@ -29,19 +29,30 @@ namespace CalculatorApp
Platform::String ^ ParenthesisCountToString(unsigned int count);
DEPENDENCY_PROPERTY_OWNER(CalculatorProgrammerRadixOperators);
void checkDefaultBitShift();
private:
enum class BitShiftMode
{
Arithmetic,
LogicalShift,
RotateCircular,
RotateCarry
};
void BitshiftFlyout_Checked(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e);
void FlyoutButton_Clicked(_In_ Platform::Object ^ sender, _In_ Windows::UI::Xaml::RoutedEventArgs ^ e);
void CollapseBitshiftButtons();
void LoadResourceStrings();
void LoadDeferredLoadButtons();
bool IsButtonLoaded();
bool m_isErrorVisualState;
void OpenParenthesisButton_GotFocus(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e);
void ClearEntryButton_LostFocus(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e);
void ClearButton_LostFocus(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e);
void BitShiftFlyout_Opened(Platform::Object ^ sender, Platform::Object ^ e);
BitShiftMode m_selectedShiftButtonMode;
Platform::String ^ m_arithmeticShiftButtonContent;
Platform::String ^ m_logicalShiftButtonContent;
Platform::String ^ m_rotateCircularButtonContent;

View file

@ -63,6 +63,7 @@
Margin="0,0,0,4"
HorizontalAlignment="Right"
Style="{ThemeResource BodyTextBlockMediumStyle}"
AutomationProperties.AutomationId="HistoryItemExpression"
AutomationProperties.Name="{x:Bind AccExpression}"
IsTextSelectionEnabled="True"
Text="{x:Bind Expression}"
@ -72,6 +73,7 @@
HorizontalAlignment="Right"
Style="{ThemeResource TitleTextBlockStyle}"
FontWeight="SemiBold"
AutomationProperties.AutomationId="HistoryItemValue"
AutomationProperties.Name="{x:Bind AccResult}"
IsTextSelectionEnabled="True"
Text="{x:Bind Result}"

View file

@ -145,6 +145,7 @@
AutomationProperties.AutomationId="NormalAlwaysOnTopButton"
Click="AlwaysOnTopButtonClick"
Content="&#xEE49;"
TabIndex="3"
Visibility="{x:Bind Model.DisplayNormalAlwaysOnTopOption, Mode=OneWay}">
<Button.KeyboardAccelerators>
<KeyboardAccelerator Key="Up" Modifiers="Menu"/>

View file

@ -54,6 +54,7 @@
HorizontalAlignment="Right"
Style="{ThemeResource TitleTextBlockStyle}"
FontWeight="SemiBold"
AutomationProperties.AutomationId="MemoryItemValue"
FlowDirection="LeftToRight"
IsTextSelectionEnabled="True"
Text="{x:Bind Model.Value, Mode=OneWay}"

View file

@ -27,8 +27,8 @@
<local:CalculatorProgrammerRadixOperators x:Name="ProgrammerRadixOperators"
TabIndex="16"
Visibility="{x:Bind Model.AreProgrammerRadixOperatorsEnabled, Mode=OneWay}"
IsEnabled="{x:Bind Model.AreProgrammerRadixOperatorsEnabled, Mode=OneWay}"
Visibility="{x:Bind Model.AreProgrammerRadixOperatorsVisible, Mode=OneWay}"
IsEnabled="{x:Bind Model.IsProgrammer, Mode=OneWay}"
x:Load="False"/>
</Grid>

View file

@ -72,11 +72,8 @@ void OperatorsPanel::EnsureProgrammerRadixOps()
this->FindName(L"ProgrammerRadixOperators");
}
if (ProgrammerRadixOperators)
{
ProgrammerRadixOperators->checkDefaultBitShift();
}
}
void OperatorsPanel::EnsureProgrammerBitFlipPanel()
{

View file

@ -0,0 +1,29 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
using OpenQA.Selenium.Appium;
using System;
using System.Collections.Generic;
using System.Text;
namespace CalculatorUITestFramework
{
public class HistoryItem
{
public AppiumWebElement Item { get; }
public HistoryItem(AppiumWebElement item)
{
Item = item;
}
public string GetValue()
{
return Item.FindElementByAccessibilityId("HistoryItemValue")?.Text;
}
public string GetExpression()
{
return Item.FindElementByAccessibilityId("HistoryItemExpression")?.Text;
}
}
}

View file

@ -5,8 +5,10 @@ using OpenQA.Selenium;
using OpenQA.Selenium.Appium;
using OpenQA.Selenium.Appium.Windows;
using OpenQA.Selenium.Interactions;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Drawing;
using System.Linq;
namespace CalculatorUITestFramework
{
@ -34,10 +36,10 @@ namespace CalculatorUITestFramework
/// Gets all of the history items listed in the History Pane.
/// </summary>
/// <returns>A readonly collection of history items.</returns>
public ReadOnlyCollection<AppiumWebElement> GetAllHistoryListViewItems()
public List<HistoryItem> GetAllHistoryListViewItems()
{
OpenHistoryPanel();
return this.HistoryListView.FindElementsByClassName("ListViewItem");
return (from item in this.HistoryListView.FindElementsByClassName("ListViewItem") select new HistoryItem(item)).ToList();
}
/// <summary>
@ -92,10 +94,10 @@ namespace CalculatorUITestFramework
/// Gets all of the History items listed in the History Flyout.
/// </summary>
/// <returns> A read only collection of History items.</returns>
public ReadOnlyCollection<AppiumWebElement> GetAllHistoryFlyoutListViewItems()
public List<HistoryItem> GetAllHistoryFlyoutListViewItems()
{
OpenHistoryFlyout();
return this.HistoryListView.FindElementsByClassName("ListViewItem");
return (from item in this.HistoryListView.FindElementsByClassName("ListViewItem") select new HistoryItem(item)).ToList();
}
/// <summary>

View file

@ -0,0 +1,25 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
using OpenQA.Selenium.Appium;
using System;
using System.Collections.Generic;
using System.Text;
namespace CalculatorUITestFramework
{
public class MemoryItem
{
public AppiumWebElement Item { get; }
public MemoryItem(AppiumWebElement item)
{
Item = item;
}
public string GetValue()
{
return Item.FindElementByAccessibilityId("MemoryItemValue")?.Text;
}
}
}

View file

@ -6,8 +6,10 @@ using OpenQA.Selenium;
using OpenQA.Selenium.Appium;
using OpenQA.Selenium.Appium.Windows;
using OpenQA.Selenium.Interactions;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Drawing;
using System.Linq;
namespace CalculatorUITestFramework
{
@ -43,10 +45,10 @@ namespace CalculatorUITestFramework
/// Gets all of the memory items listed in the Memory Pane.
/// </summary>
/// <returns>A read-only collection of memory items.</returns>
public ReadOnlyCollection<AppiumWebElement> GetAllMemoryListViewItems()
public List<MemoryItem> GetAllMemoryListViewItems()
{
OpenMemoryPanel();
return this.MemoryListView.FindElementsByClassName("ListViewItem");
return (from item in this.MemoryListView.FindElementsByClassName("ListViewItem") select new MemoryItem(item)).ToList();
}
/// <summary>
@ -119,10 +121,10 @@ namespace CalculatorUITestFramework
/// Gets all of the memory items listed in the Memory Flyout.
/// </summary>
/// <returns> A read only collection of memory items.</returns>
public ReadOnlyCollection<AppiumWebElement> GetAllMemoryFlyoutListViewItems()
public List<MemoryItem> GetAllMemoryFlyoutListViewItems()
{
OpenMemoryFlyout();
return this.MemoryListView.FindElementsByClassName("ListViewItem");
return (from item in this.MemoryListView.FindElementsByClassName("ListViewItem") select new MemoryItem(item)).ToList();
}
/// <summary>

View file

@ -88,20 +88,22 @@ namespace CalculatorUITests
page.StandardOperators.EqualButton.Click();
var historyItems = page.HistoryPanel.GetAllHistoryListViewItems();
Assert.IsTrue(historyItems[0].Text.Equals("2 Minus ( 3= Minus (1", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(historyItems[1].Text.Equals("-3 + -2.6= Minus (5.6", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(historyItems[0].GetValue().Equals("-1", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(historyItems[0].GetExpression().Equals("2 - 3 =", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(historyItems[1].GetValue().Equals("-5.6", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(historyItems[1].GetExpression().Equals("-3 + -2.6 =", StringComparison.InvariantCultureIgnoreCase));
Assert.AreEqual("-1", page.CalculatorResults.GetCalculatorResultText());
Actions clickHistoryItemsw1 = new Actions(WinAppDriver.Instance.CalculatorSession);
clickHistoryItemsw1.Click(historyItems[1]);
clickHistoryItemsw1.Click(historyItems[1].Item);
clickHistoryItemsw1.Perform();
Assert.AreEqual("-5.6", page.CalculatorResults.GetCalculatorResultText());
Assert.AreEqual("-3 + -2.6=", page.CalculatorResults.GetCalculatorExpressionText());
Actions clickHistoryItemsw0 = new Actions(WinAppDriver.Instance.CalculatorSession);
clickHistoryItemsw0.Click(historyItems[0]);
clickHistoryItemsw0.Click(historyItems[0].Item);
clickHistoryItemsw0.Perform();
Assert.AreEqual("-1", page.CalculatorResults.GetCalculatorResultText());
@ -131,14 +133,18 @@ namespace CalculatorUITests
page.StandardOperators.EqualButton.Click();
var historyPanelItems = page.HistoryPanel.GetAllHistoryListViewItems();
Assert.IsTrue(historyPanelItems[0].Text.Equals("2 Minus ( 3= Minus (1", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(historyPanelItems[1].Text.Equals("-3 + -2.6= Minus (5.6", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(historyPanelItems[0].GetValue().Equals("-1", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(historyPanelItems[0].GetExpression().Equals("2 - 3 =", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(historyPanelItems[1].GetValue().Equals("-5.6", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(historyPanelItems[1].GetExpression().Equals("-3 + -2.6 =", StringComparison.InvariantCultureIgnoreCase));
Assert.AreEqual("-1", page.CalculatorResults.GetCalculatorResultText());
var historyItems = page.HistoryPanel.GetAllHistoryFlyoutListViewItems();
Assert.IsTrue(historyItems[0].Text.Equals("2 Minus ( 3= Minus (1", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(historyItems[1].Text.Equals("-3 + -2.6= Minus (5.6", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(historyItems[0].GetValue().Equals("-1", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(historyItems[0].GetExpression().Equals("2 - 3 =", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(historyItems[1].GetValue().Equals("-5.6", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(historyItems[1].GetExpression().Equals("-3 + -2.6 =", StringComparison.InvariantCultureIgnoreCase));
Assert.AreEqual("-1", page.CalculatorResults.GetCalculatorResultText());

View file

@ -77,20 +77,20 @@ namespace CalculatorUITests
Actions moveToListView = new Actions(WinAppDriver.Instance.CalculatorSession);
var memoryItems = page.MemoryPanel.GetAllMemoryListViewItems();
moveToListView.MoveToElement(memoryItems[0]);
moveToListView.ContextClick(memoryItems[0]);
moveToListView.MoveToElement(memoryItems[0].Item);
moveToListView.ContextClick(memoryItems[0].Item);
moveToListView.Perform();
CalculatorApp.Window.SendKeys(Keys.ArrowDown + Keys.ArrowDown + Keys.Enter);
Assert.IsTrue(memoryItems[0].Text.Equals("0", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(memoryItems[0].GetValue().Equals("0", StringComparison.InvariantCultureIgnoreCase));
moveToListView.Perform();
CalculatorApp.Window.SendKeys(Keys.ArrowUp + Keys.ArrowUp + Keys.Enter);
Assert.IsTrue(memoryItems[0].Text.Equals("3", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(memoryItems[0].GetValue().Equals("3", StringComparison.InvariantCultureIgnoreCase));
moveToListView.Perform();
CalculatorApp.Window.SendKeys(Keys.ArrowDown + Keys.ArrowUp + Keys.Enter);
var memoryItems2 = page.MemoryPanel.GetAllMemoryListViewItems();
Assert.IsTrue(memoryItems2[0].Text.Equals("3", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(memoryItems2[0].GetValue().Equals("3", StringComparison.InvariantCultureIgnoreCase));
page.MemoryPanel.PanelClearMemoryButton.Click();
Assert.IsNotNull(WinAppDriver.Instance.CalculatorSession.FindElementByAccessibilityId("MemoryPaneEmpty"));
@ -108,22 +108,22 @@ namespace CalculatorUITests
page.MemoryPanel.OpenMemoryFlyout();
var memoryItems = page.MemoryPanel.GetAllMemoryFlyoutListViewItems();
Actions moveToListView = new Actions(WinAppDriver.Instance.CalculatorSession);
moveToListView.MoveToElement(memoryItems[0]);
moveToListView.ContextClick(memoryItems[0]);
moveToListView.MoveToElement(memoryItems[0].Item);
moveToListView.ContextClick(memoryItems[0].Item);
moveToListView.Perform();
CalculatorApp.Window.SendKeys(Keys.ArrowDown + Keys.ArrowDown + Keys.Enter);
Assert.IsTrue(memoryItems[0].Text.Equals("0", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(memoryItems[0].GetValue().Equals("0", StringComparison.InvariantCultureIgnoreCase));
page.MemoryPanel.OpenMemoryFlyout();
moveToListView.Perform();
CalculatorApp.Window.SendKeys(Keys.ArrowUp + Keys.ArrowUp + Keys.Enter);
Assert.IsTrue(memoryItems[0].Text.Equals("3", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(memoryItems[0].GetValue().Equals("3", StringComparison.InvariantCultureIgnoreCase));
page.MemoryPanel.OpenMemoryFlyout();
moveToListView.Perform();
CalculatorApp.Window.SendKeys(Keys.ArrowDown + Keys.ArrowUp + Keys.Enter);
var memoryItems2 = page.MemoryPanel.GetAllMemoryListViewItems();
Assert.IsTrue(memoryItems2[0].Text.Equals("3", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(memoryItems2[0].GetValue().Equals("3", StringComparison.InvariantCultureIgnoreCase));
page.MemoryPanel.OpenMemoryFlyout();
page.MemoryPanel.PanelClearMemoryButton.Click();

View file

@ -171,10 +171,12 @@ namespace CalculatorUITests
page.HistoryPanel.ResizeWindowToDisplayHistoryButton();
page.HistoryPanel.HistoryButton.Click();
var historyFlyoutItems = page.HistoryPanel.GetAllHistoryFlyoutListViewItems();
Assert.IsTrue(historyFlyoutItems[0].Text.Equals("4 × 5 ÷ 6= 3.333333333333333", StringComparison.InvariantCultureIgnoreCase)); //verifies History button
Assert.IsTrue(historyFlyoutItems[0].GetValue().Equals("3.333333333333333", StringComparison.InvariantCultureIgnoreCase)); //verifies History button
Assert.IsTrue(historyFlyoutItems[0].GetExpression().Equals("4 × 5 ÷ 6 =", StringComparison.InvariantCultureIgnoreCase)); //verifies History button
page.HistoryPanel.ResizeWindowToDisplayHistoryLabel();
var historyItems = page.HistoryPanel.GetAllHistoryListViewItems();
Assert.IsTrue(historyItems[0].Text.Equals("4 × 5 ÷ 6= 3.333333333333333", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(historyItems[0].GetValue().Equals("3.333333333333333", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(historyItems[0].GetExpression().Equals("4 × 5 ÷ 6 =", StringComparison.InvariantCultureIgnoreCase));
page.HistoryPanel.ClearHistoryButton.Click();
Assert.IsNotNull(WinAppDriver.Instance.CalculatorSession.FindElementByAccessibilityId("HistoryEmpty")); //verifies the History panel's clear history button
}
@ -187,16 +189,16 @@ namespace CalculatorUITests
page.StandardOperators.NumberPad.Num1Button.Click();
page.MemoryPanel.NumberpadMSButton.Click();
var memoryItems = page.MemoryPanel.GetAllMemoryListViewItems();
Assert.IsTrue(memoryItems[0].Text.Equals("1", StringComparison.InvariantCultureIgnoreCase)); //verifies memory button
Assert.IsTrue(memoryItems[0].GetValue().Equals("1", StringComparison.InvariantCultureIgnoreCase)); //verifies memory button
page.MemoryPanel.NumberpadMPlusButton.Click();
Assert.IsTrue(memoryItems[0].Text.Equals("2", StringComparison.InvariantCultureIgnoreCase)); //verifies memory plus button
Assert.IsTrue(memoryItems[0].GetValue().Equals("2", StringComparison.InvariantCultureIgnoreCase)); //verifies memory plus button
page.MemoryPanel.NumberpadMRButton.Click();
Assert.AreEqual("2", page.CalculatorResults.GetCalculatorResultText()); //verifies memory recall button
page.StandardOperators.MinusButton.Click();
page.StandardOperators.NumberPad.Num1Button.Click();
page.StandardOperators.EqualButton.Click();
page.MemoryPanel.NumberpadMMinusButton.Click();
Assert.IsTrue(memoryItems[0].Text.Equals("1", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(memoryItems[0].GetValue().Equals("1", StringComparison.InvariantCultureIgnoreCase));
Assert.AreEqual("1", page.CalculatorResults.GetCalculatorResultText()); //verifies MemMinus button
page.MemoryPanel.NumberpadMCButton.Click();
Assert.IsNotNull(WinAppDriver.Instance.CalculatorSession.FindElementByAccessibilityId("MemoryPaneEmpty")); //verifies the Memory panel's memory clear button
@ -344,9 +346,9 @@ namespace CalculatorUITests
CalculatorApp.Window.SendKeys("1");
CalculatorApp.Window.SendKeys(Keys.Control + "m" + Keys.Control);
var memoryItems = page.MemoryPanel.GetAllMemoryListViewItems();
Assert.IsTrue(memoryItems[0].Text.Equals("1", StringComparison.InvariantCultureIgnoreCase)); //verifies memory hotkey
Assert.IsTrue(memoryItems[0].GetValue().Equals("1", StringComparison.InvariantCultureIgnoreCase)); //verifies memory hotkey
CalculatorApp.Window.SendKeys(Keys.Control + "p" + Keys.Control);
Assert.IsTrue(memoryItems[0].Text.Equals("2", StringComparison.InvariantCultureIgnoreCase)); //verifies memory plus hotkey
Assert.IsTrue(memoryItems[0].GetValue().Equals("2", StringComparison.InvariantCultureIgnoreCase)); //verifies memory plus hotkey
CalculatorApp.Window.SendKeys(Keys.Control + "r" + Keys.Control);
Assert.AreEqual("2", page.CalculatorResults.GetCalculatorResultText()); //verifies memory recall hotkey
CalculatorApp.Window.SendKeys(Keys.Subtract);
@ -354,7 +356,7 @@ namespace CalculatorUITests
CalculatorApp.Window.SendKeys(Keys.Equal);
CalculatorApp.Window.SendKeys(Keys.Subtract);
CalculatorApp.Window.SendKeys(Keys.Control + "q" + Keys.Control);
Assert.IsTrue(memoryItems[0].Text.Equals("1", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(memoryItems[0].GetValue().Equals("1", StringComparison.InvariantCultureIgnoreCase));
Assert.AreEqual("1", page.CalculatorResults.GetCalculatorResultText()); //verifies MemMinus hotkey
CalculatorApp.Window.SendKeys(Keys.Control + "l" + Keys.Control);
Assert.IsNotNull(WinAppDriver.Instance.CalculatorSession.FindElementByAccessibilityId("MemoryPaneEmpty")); //verifies the Memory panel's memory clear button hotkey
@ -536,8 +538,10 @@ namespace CalculatorUITests
CalculatorApp.Window.SendKeys(Keys.Equal);
Assert.AreEqual("0", page.CalculatorResults.GetCalculatorResultText());
var historyItems = page.HistoryPanel.GetAllHistoryListViewItems();
Assert.IsTrue(historyItems[0].Text.Equals("0= 0", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(historyItems[1].Text.Equals("0= 0", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(historyItems[0].GetValue().Equals("0", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(historyItems[0].GetExpression().Equals("0 =", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(historyItems[1].GetValue().Equals("0", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(historyItems[1].GetExpression().Equals("0 =", StringComparison.InvariantCultureIgnoreCase));
CalculatorApp.Window.SendKeys(Keys.Escape);
}
@ -670,7 +674,8 @@ namespace CalculatorUITests
{
page.StandardAoTCalculatorPage.NavigateToStandardMode();
var historyItems = page.HistoryPanel.GetAllHistoryListViewItems();
Assert.IsTrue(historyItems[0].Text.Equals("3 + 3= 6", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(historyItems[0].GetValue().Equals("6", StringComparison.InvariantCultureIgnoreCase));
Assert.IsTrue(historyItems[0].GetExpression().Equals("3 + 3 =", StringComparison.InvariantCultureIgnoreCase));
}
}

View file

@ -168,7 +168,7 @@
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile>$(IntDir)pch.pch</PrecompiledHeaderOutputFile>
<AdditionalUsingDirectories>$(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)</AdditionalUsingDirectories>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions>/bigobj /await /std:c++17 /utf-8 %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>28204</DisableSpecificWarnings>
</ClCompile>
<Link>
@ -183,7 +183,7 @@
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile>$(IntDir)pch.pch</PrecompiledHeaderOutputFile>
<AdditionalUsingDirectories>$(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)</AdditionalUsingDirectories>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions>/bigobj /await /std:c++17 /utf-8 %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>28204</DisableSpecificWarnings>
</ClCompile>
<Link>
@ -198,7 +198,7 @@
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile>$(IntDir)pch.pch</PrecompiledHeaderOutputFile>
<AdditionalUsingDirectories>$(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)</AdditionalUsingDirectories>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions>/bigobj /await /std:c++17 /utf-8 %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>28204</DisableSpecificWarnings>
</ClCompile>
<Link>
@ -213,7 +213,7 @@
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile>$(IntDir)pch.pch</PrecompiledHeaderOutputFile>
<AdditionalUsingDirectories>$(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)</AdditionalUsingDirectories>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions>/bigobj /await /std:c++17 /utf-8 %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>28204</DisableSpecificWarnings>
</ClCompile>
<Link>
@ -228,7 +228,7 @@
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile>$(IntDir)pch.pch</PrecompiledHeaderOutputFile>
<AdditionalUsingDirectories>$(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)</AdditionalUsingDirectories>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions>/bigobj /await /std:c++17 /utf-8 %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>28204</DisableSpecificWarnings>
</ClCompile>
<Link>
@ -243,7 +243,7 @@
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile>$(IntDir)pch.pch</PrecompiledHeaderOutputFile>
<AdditionalUsingDirectories>$(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)</AdditionalUsingDirectories>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions>/bigobj /await /std:c++17 /utf-8 %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>28204</DisableSpecificWarnings>
</ClCompile>
<Link>
@ -258,7 +258,7 @@
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile>$(IntDir)pch.pch</PrecompiledHeaderOutputFile>
<AdditionalUsingDirectories>$(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)</AdditionalUsingDirectories>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions>/bigobj /await /std:c++17 /utf-8 %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>28204</DisableSpecificWarnings>
</ClCompile>
<Link>