diff --git a/Vts.Gui.Wpf.Test/ViewModel/Panels/ForwardSolverViewModelTests.cs b/Vts.Gui.Wpf.Test/ViewModel/Panels/ForwardSolverViewModelTests.cs index bd6dbcb..9aff00c 100644 --- a/Vts.Gui.Wpf.Test/ViewModel/Panels/ForwardSolverViewModelTests.cs +++ b/Vts.Gui.Wpf.Test/ViewModel/Panels/ForwardSolverViewModelTests.cs @@ -15,7 +15,7 @@ public class ForwardSolverViewModelTests /// Verifies that ForwardSolverViewModel default constructor instantiates sub viewmodels /// [Test] - public void verify_default_constructor_sets_properties_correctly() + public void Verify_default_constructor_sets_properties_correctly() { // WindowViewModel needs to be instantiated for default constructor var windowViewModel = new WindowViewModel(); @@ -67,11 +67,100 @@ public void Verify_ExecuteForwardSolverCommand_returns_correct_values() Assert.AreEqual(s1, textOutputViewModel.Text); } + /// + /// Verifies that ForwardSolverViewModel returns correct multi-region tissue values + /// + [Test] + public void Verify_ExecuteForwardSolverCommand_multi_region_tissue_returns_correct_values() + { + // WindowViewModel needs to be instantiated for default constructor + var windowViewModel = new WindowViewModel(); + var viewModel = windowViewModel.ForwardSolverVM; + viewModel.ForwardSolverTypeOptionVM.SelectedValue = ForwardSolverType.TwoLayerSDA; + viewModel.SolutionDomainTypeOptionVM.SelectedValue = SolutionDomainType.ROfFx; + viewModel.ForwardAnalysisTypeOptionVM.SelectedValue = ForwardAnalysisType.R; + viewModel.ExecuteForwardSolverCommand.Execute(null); + var plotViewModel = windowViewModel.PlotVM; + const int i1 = 1; + const double d2 = 0.0100; + // s1 should be "Plot View: plot cleared due to independent axis variable change + // Forward Solver: Vts.Gui.Wpf.ViewModel.MultiRegionTissueViewModel" + var s1 = StringLookup.GetLocalizedString("Message_PlotViewCleared") + "\r" + + StringLookup.GetLocalizedString("Label_ForwardSolver") + + "Vts.Gui.Wpf.ViewModel.MultiRegionTissueViewModel\r"; + // s2 should be "R(ρ) [Unitless] versus fx [1/mm]" + var s2 = StringLookup.GetLocalizedString("Label_ROfRho") + " [Unitless] " + + StringLookup.GetLocalizedString("Label_Versus") + " fx [1/mm]"; + // s3 should be "Model - 2 layer SDA\rμa1 = 0.0100\rμs'1=1.0000\rμa2 = 0.0100\r μs'2=1.0000" + var s3 = "\r" + StringLookup.GetLocalizedString("Label_Model2LayerSDA") + "\r" + + StringLookup.GetLocalizedString("Label_MuA1") + "=" + + d2.ToString("N4", CultureInfo.CurrentCulture) + "\r" + + StringLookup.GetLocalizedString("Label_MuSPrime1") + "=" + + i1.ToString("N4", CultureInfo.CurrentCulture) + "\r" + + StringLookup.GetLocalizedString("Label_MuA2") + "=" + + d2.ToString("N4", CultureInfo.CurrentCulture) + "\r" + + StringLookup.GetLocalizedString("Label_MuSPrime2") + "=" + + i1.ToString("N4", CultureInfo.CurrentCulture); + Assert.AreEqual(s3, plotViewModel.Labels[0]); + Assert.AreEqual(s2, plotViewModel.Title); + var textOutputViewModel = windowViewModel.TextOutputVM; + Assert.AreEqual(s1, textOutputViewModel.Text); + } + + /// + /// Verifies that ForwardSolverViewModel returns correct complex derivative values + /// + [Test] + public void Verify_ExecuteForwardSolverCommand_complex_derivative_returns_correct_values() + { + // WindowViewModel needs to be instantiated for default constructor + var windowViewModel = new WindowViewModel(); + var viewModel = windowViewModel.ForwardSolverVM; + viewModel.ForwardSolverTypeOptionVM.SelectedValue = ForwardSolverType.MonteCarlo; + viewModel.SolutionDomainTypeOptionVM.SelectedValue = SolutionDomainType.ROfFxAndFt; + viewModel.ForwardAnalysisTypeOptionVM.SelectedValue = ForwardAnalysisType.dRdMua; + viewModel.ExecuteForwardSolverCommand.Execute(null); + var plotViewModel = windowViewModel.PlotVM; + const double d1 = 0.01; + const int i1 = 1; + const double g = 0.8; + const double n = 1.4; + const double d2 = 0.0100; + const double d3 = 1.0000; + const double d4 = 0; + // s1 should be "Plot View: plot cleared due to independent axis variable change + // Forward Solver: μa = 0.01 μs'=1 g=0.8 n=1.4; Units = 1/mm" + var s1 = StringLookup.GetLocalizedString("Message_PlotViewCleared") + "\r" + + StringLookup.GetLocalizedString("Label_ForwardSolver") + + StringLookup.GetLocalizedString("Label_MuA") + "=" + + d1.ToString(CultureInfo.CurrentCulture) + " " + + StringLookup.GetLocalizedString("Label_MuSPrime") + "=" + + i1.ToString(CultureInfo.CurrentCulture) + " g=" + + g.ToString(CultureInfo.CurrentCulture) + " n=" + + n.ToString(CultureInfo.CurrentCulture) + "; " + + StringLookup.GetLocalizedString("Label_Units") + " = 1/mm\r"; + // s2 should be "R(ρ) [GHz-1] versus fx [1/mm]" + var s2 = StringLookup.GetLocalizedString("Label_ROfRho") + " [GHz-1] " + + StringLookup.GetLocalizedString("Label_Versus") + " fx [1/mm]"; + // "ft" is not in Strings.resx + var s3 = "\r" + StringLookup.GetLocalizedString("Label_ModelScaledMC") + "\r" + + StringLookup.GetLocalizedString("Label_MuA") + "=" + + d2.ToString("N4", CultureInfo.CurrentCulture) + " \r" + + StringLookup.GetLocalizedString("Label_MuSPrime") + "=" + + d3.ToString("N4", CultureInfo.CurrentCulture) + " \rft = " + + d4.ToString("N0", CultureInfo.CurrentCulture) + " " + + StringLookup.GetLocalizedString("Measurement_GHz"); + Assert.AreEqual(s3, plotViewModel.Labels[0]); + Assert.AreEqual(s2, plotViewModel.Title); + var textOutputViewModel = windowViewModel.TextOutputVM; + Assert.AreEqual(s1, textOutputViewModel.Text); + } + /// /// Verifies that ForwardSolverViewModel disallows spectral panel inputs for TwoLayerSDA selection /// [Test] - public void verify_TwoLayerSDA_selection_does_not_display_usespectralpanelinputs_checkbox() + public void Verify_TwoLayerSDA_selection_does_not_display_usespectralpanelinputs_checkbox() { // WindowViewModel needs to be instantiated for default constructor var windowViewModel = new WindowViewModel(); @@ -83,12 +172,13 @@ public void verify_TwoLayerSDA_selection_does_not_display_usespectralpanelinputs Assert.IsFalse(viewModel.SolutionDomainTypeOptionVM.EnableMultiAxis); Assert.IsFalse(viewModel.SolutionDomainTypeOptionVM.EnableSpectralPanelInputs); } + /// /// Verifies that ForwardSolverViewModel disallows time-dependent solution domain options /// for DistributedGaussianSourceSDA selection /// [Test] - public void verify_DistributedGaussianSourceSDA_selection_does_not_display_time_dependent_solution_domain_options() + public void Verify_DistributedGaussianSourceSDA_selection_does_not_display_time_dependent_solution_domain_options() { // WindowViewModel needs to be instantiated for default constructor var windowViewModel = new WindowViewModel(); @@ -101,5 +191,7 @@ public void verify_DistributedGaussianSourceSDA_selection_does_not_display_time_ Assert.IsFalse(viewModel.SolutionDomainTypeOptionVM.IsROfFxAndTimeEnabled); Assert.IsFalse(viewModel.SolutionDomainTypeOptionVM.IsROfFxAndFtEnabled); } + + } } diff --git a/Vts.Gui.Wpf/ViewModel/Panels/PlotViewModel.cs b/Vts.Gui.Wpf/ViewModel/Panels/PlotViewModel.cs index b7aa078..c7d6492 100644 --- a/Vts.Gui.Wpf/ViewModel/Panels/PlotViewModel.cs +++ b/Vts.Gui.Wpf/ViewModel/Panels/PlotViewModel.cs @@ -564,7 +564,7 @@ private void Plot_SetAxesLabels_Executed(object sender) if (sender is PlotAxesLabels labels) { _clearPlot = false; - // set CurrentIndependtVariableAxis prior to setting Title because property + // set CurrentIndependentVariableAxis prior to setting Title because property // might ClearPlot including Title if (CurrentIndependentVariableAxis != labels.IndependentAxis.AxisType) { @@ -1015,11 +1015,6 @@ private void GenerateComplexDerivativePlot(DataPointCollection dataPointCollecti { case PlotToggleType.Phase: y = -(dp.PhaseDerivative * (180 / Math.PI)); - //// force phase to be between 0 and 360 - //if (y < 0) - //{ - // y += 360; - //} switch (PlotNormalizationTypeOptionVm.SelectedValue) { case PlotNormalizationType.RelativeToCurve: