2021-07-12 21:31:46 +02:00
using NUnit.Framework ;
using TINK.Model ;
using TINK.Model.User.Account ;
using TINK.Model.Connector ;
using System ;
using TINK.Model.Station ;
using static TINK . Repository . CopriCallsMemory ;
using TINK.Model.State ;
using System.Collections.Generic ;
using TINK.Repository ;
using TINK.ViewModel.Map ;
using TINK.ViewModel.Settings ;
using TINK.Services ;
2022-04-10 17:38:34 +02:00
using TINK.Services.Geolocation ;
2021-11-14 23:27:29 +01:00
using TestFramework.Model.User.Account ;
using TestFramework.Model.Device ;
using TestFramework.Services.BluetoothLock ;
using TestFramework.Repository ;
using TestFramework.Model.Services.Geolocation ;
using TestFramework.Services.Permissions ;
using NSubstitute ;
using TestFramework ;
2021-07-12 21:31:46 +02:00
2021-11-14 23:27:29 +01:00
namespace TestShareeLib.UseCases.Startup
2021-07-12 21:31:46 +02:00
{
[TestFixture]
public class TestTinkApp
{
[Test]
public void NotLoggedIn ( )
{
var l_oConnector = new ConnectorCache (
string . Empty ,
string . Empty ,
new CopriCallsMemory ( SampleSets . Set2 , 1 ) ) ;
var l_oTinkApp = new TinkApp (
new TINK . Model . Settings . Settings (
2021-11-14 23:27:29 +01:00
new GroupFilterMapPage ( new Dictionary < string , FilterState > { { FilterHelper . FILTERTINKGENERAL , FilterState . On } } ) ,
new GroupFilterSettings ( new Dictionary < string , FilterState > { { FilterHelper . FILTERTINKGENERAL , FilterState . On } , { FilterHelper . FILTERKONRAD , FilterState . On } } ) ,
2021-07-12 21:31:46 +02:00
new Uri ( "https://tinkwwp.copri-bike.de/APIjsonserver" ) ,
new TINK . Settings . PollingParameters ( new TimeSpan ( 10000 ) , true ) ,
Serilog . Events . LogEventLevel . Error ,
activeLockService : typeof ( LocksServiceMock ) . FullName ,
activeGeolocationService : typeof ( GeolocationMock ) . FullName ) ,
new StoreMock ( ) ,
2022-01-04 18:59:16 +01:00
( isConnected , uri , sessionCookie , mail , expiresAfter ) = > new ConnectorCache ( new AppContextInfo ( "MyMerchId" , "MyApp" , new Version ( 1 , 2 ) ) , sessionCookie , mail , new CopriCallsMemory001 ( ) ) ,
2021-07-12 21:31:46 +02:00
Substitute . For < IServicesContainer < IGeolocation > > ( ) ,
new LocksServiceMock ( ) ,
new DeviceMock ( ) ,
new SpecialFolderMock ( ) ,
null , // Cipher
2022-04-10 17:38:34 +02:00
Substitute . For < ILocationPermission > ( ) ,
2021-07-12 21:31:46 +02:00
isConnectedFunc : ( ) = > true ,
currentVersion : new Version ( 3 , 2 , 0 , 115 ) , // Current app version
lastVersion : new Version ( 3 , 0 , 173 ) ) ; // Current app version. Must be larger or equal 3.0.173 to
var l_oStations = l_oTinkApp . GetConnector ( true ) . Query . GetBikesAndStationsAsync ( ) . Result . Response ;
// Check stations.
2021-11-14 23:27:29 +01:00
Assert . AreEqual ( 21 , l_oStations . StationsAll . Count ) ;
Assert . NotNull ( l_oStations . StationsAll . GetById ( "KN4" ) ) ; // Id of station was "4" in former version of COPRI.
Assert . AreEqual ( "KN4" , l_oStations . StationsAll . GetById ( "KN4" ) . Id ) ;
Assert . AreEqual ( new Position ( 47.658592 , 9.168569 ) , l_oStations . StationsAll . GetById ( "KN4" ) . Position ) ; // Former position was 47.6586936667, 9.16863116667
2021-07-12 21:31:46 +02:00
// Verify selected station.
Assert . AreEqual (
null ,
l_oTinkApp . SelectedStation . Id ,
"When starting app selected station must always be invlid" ) ;
// Verify bikes at station.
Assert . AreEqual (
0 ,
TestHelper . GetBikesAtStation ( l_oTinkApp . ActiveUser , l_oConnector , l_oTinkApp . SelectedStation . Id ) . Result . Count ,
"If no station is selected BikesAtStation- list count must be zero" ) ;
// Check my bikes.
Assert . IsFalse ( l_oTinkApp . ActiveUser . IsLoggedIn ) ;
}
[Test]
public void LoggedIn_BikesReservedBooked ( )
{
var l_oConnector = new ConnectorCache (
"4da3044c8657a04ba60e2eaa753bc51a" ,
"javaminister@gmail.com" ,
new CopriCallsMemory ( SampleSets . Set2 , 1 , "4da3044c8657a04ba60e2eaa753bc51a" ) ) ;
// User logged in is initial state to verify.
var l_oTinkApp = new TinkApp (
new TINK . Model . Settings . Settings (
2021-11-14 23:27:29 +01:00
new GroupFilterMapPage ( new Dictionary < string , FilterState > { { FilterHelper . FILTERTINKGENERAL , FilterState . On } } ) ,
new GroupFilterSettings ( new Dictionary < string , FilterState > { { FilterHelper . FILTERTINKGENERAL , FilterState . On } , { FilterHelper . FILTERKONRAD , FilterState . On } } ) ,
2021-07-12 21:31:46 +02:00
new Uri ( "https://tinkwwp.copri-bike.de/APIjsonserver" ) , new TINK . Settings . PollingParameters ( new TimeSpan ( 10000 ) , true ) ,
Serilog . Events . LogEventLevel . Error ,
activeLockService : typeof ( LocksServiceMock ) . FullName ,
activeGeolocationService : typeof ( GeolocationMock ) . FullName ) ,
2021-11-14 23:27:29 +01:00
new StoreMock ( new Account ( "javaminister@gmail.com" , "javaminister" /* password */ , "4da3044c8657a04ba60e2eaa753bc51a" /* session cookie */ , new List < string > { FilterHelper . FILTERTINKGENERAL , FilterHelper . FILTERKONRAD } ) ) ,
2022-01-04 18:59:16 +01:00
( isConnected , uri , sessionCookie , mail , expiresAfter ) = > new ConnectorCache ( new AppContextInfo ( "MyMerchId" , "MyApp" , new Version ( 1 , 2 ) ) , sessionCookie , mail , new CopriCallsMemory001 ( "6103_112e96b36ba33de245943c5ffaf369cd_" ) ) ,
2021-07-12 21:31:46 +02:00
Substitute . For < IServicesContainer < IGeolocation > > ( ) ,
new LocksServiceMock ( ) ,
new DeviceMock ( ) ,
new SpecialFolderMock ( ) ,
null , // Cipher
2022-04-10 17:38:34 +02:00
Substitute . For < ILocationPermission > ( ) ,
2021-07-12 21:31:46 +02:00
isConnectedFunc : ( ) = > true ,
currentVersion : new Version ( 3 , 2 , 0 , 115 ) ,
lastVersion : new Version ( 3 , 0 , 173 ) ) ; // Current app version. Must be larger or equal 3.0.173 to
var l_oStations = l_oTinkApp . GetConnector ( true ) . Query . GetBikesAndStationsAsync ( ) . Result . Response ;
// Check stations.
2021-11-14 23:27:29 +01:00
Assert . AreEqual ( 21 , l_oStations . StationsAll . Count ) ;
Assert . NotNull ( l_oStations . StationsAll . GetById ( "KN4" ) ) ;
Assert . AreEqual ( "KN4" , l_oStations . StationsAll . GetById ( "KN4" ) . Id ) ;
Assert . AreEqual ( new Position ( 47.658592 , 9.168569 ) , l_oStations . StationsAll . GetById ( "KN4" ) . Position ) ; // Former position was 47.6586936667, 9.16863116667
2021-07-12 21:31:46 +02:00
// Verify selected station.
Assert . AreEqual (
null ,
l_oTinkApp . SelectedStation . Id ,
"When starting app selected station must always be invlid" ) ;
// Verify bikes at station.
Assert . AreEqual (
0 ,
TestHelper . GetBikesAtStation ( l_oTinkApp . ActiveUser , l_oConnector , l_oTinkApp . SelectedStation . Id ) . Result . Count ,
"If no station is selected BikesAtStation- list count must be zero" ) ;
// Check my bikes
var l_oBikes = l_oTinkApp . GetConnector ( true ) . Query . GetBikesOccupiedAsync ( ) . Result . Response ;
Assert . AreEqual ( 2 , l_oBikes . Count ) ;
2021-11-14 23:27:29 +01:00
Assert . AreEqual ( "FR1544" , l_oBikes . GetById ( "FR1544" ) . Id ) ; // Bike used here was from set CopriCallsMemory(SampleSets.Set2, 1) and had ID 8
Assert . AreEqual ( InUseStateEnum . Booked , l_oBikes . GetById ( "FR1544" ) . State . Value ) ;
Assert . AreEqual ( "FR103" , l_oBikes . GetById ( "FR1544" ) . CurrentStation ) ; // // Bike used here was at station 5
Assert . That ( l_oBikes . GetById ( "FR1544" ) . TypeOfBike , Is . Null ) ; // Bike used here was TypeOfBike.Cargo
Assert . That ( l_oBikes . GetById ( "FR1544" ) . WheelType , Is . Null ) ; // Bike was of Type WheelType.Two
Assert . AreEqual ( "FR1004" , l_oBikes . GetById ( "FR1004" ) . Id ) ;
2021-07-12 21:31:46 +02:00
}
[Test]
public void LoggedIn_AllBikesDisposable_FilterTINK ( )
{
var l_oConnector = new ConnectorCache (
"1234" ,
"mgrimm@gmail.com" ,
new CopriCallsMemory ( SampleSets . Set2 , 1 ) ) ;
// No user logged in is initial state to verify.
var l_oTinkApp = new TinkApp (
new TINK . Model . Settings . Settings (
2021-11-14 23:27:29 +01:00
new GroupFilterMapPage ( new Dictionary < string , FilterState > { { FilterHelper . FILTERTINKGENERAL , FilterState . On } } ) ,
new GroupFilterSettings ( new Dictionary < string , FilterState > { { FilterHelper . FILTERTINKGENERAL , FilterState . On } , { FilterHelper . FILTERKONRAD , FilterState . On } } ) ,
2021-07-12 21:31:46 +02:00
new Uri ( "https://app.tink-konstanz.de/APIjsonserver" ) ,
new TINK . Settings . PollingParameters ( new TimeSpan ( 10000 ) , true ) ,
Serilog . Events . LogEventLevel . Error ,
activeLockService : typeof ( LocksServiceMock ) . FullName ,
activeGeolocationService : typeof ( GeolocationMock ) . FullName ) ,
2021-11-14 23:27:29 +01:00
new StoreMock ( new Account ( "mgrimm@gmail.com" , "123456789" /* password */ , "1234" /* session cookie */ , new List < string > { FilterHelper . FILTERTINKGENERAL , FilterHelper . FILTERKONRAD } ) ) ,
2022-01-04 18:59:16 +01:00
( isConnected , uri , sessionCookie , mail , expiresAfter ) = > new ConnectorCache ( new AppContextInfo ( "MyMerchId" , "MyApp" , new Version ( 1 , 2 ) ) , sessionCookie , mail , new CopriCallsMemory001 ( ) ) ,
2021-07-12 21:31:46 +02:00
Substitute . For < IServicesContainer < IGeolocation > > ( ) ,
new LocksServiceMock ( ) ,
new DeviceMock ( ) ,
new SpecialFolderMock ( ) ,
null , // Cipher
2022-04-10 17:38:34 +02:00
Substitute . For < ILocationPermission > ( ) ,
2021-07-12 21:31:46 +02:00
isConnectedFunc : ( ) = > true ,
currentVersion : new Version ( 3 , 2 , 0 , 115 ) ,
lastVersion : new Version ( 3 , 0 , 173 ) ) ; // Current app version. Must be larger or equal 3.0.173 to
var l_oStations = l_oTinkApp . GetConnector ( true ) . Query . GetBikesAndStationsAsync ( ) . Result . Response ;
// Check stations.
2021-11-14 23:27:29 +01:00
Assert . AreEqual ( 21 , l_oStations . StationsAll . Count ) ;
Assert . NotNull ( l_oStations . StationsAll . GetById ( "KN4" ) ) ;
Assert . AreEqual ( "KN4" , l_oStations . StationsAll . GetById ( "KN4" ) . Id ) ;
Assert . AreEqual ( new Position ( 47.658592 , 9.168569 ) , l_oStations . StationsAll . GetById ( "KN4" ) . Position ) ; // Former position was 47.6586936667, 9.16863116667
2021-07-12 21:31:46 +02:00
// Verify selected station.
Assert . AreEqual (
null ,
l_oTinkApp . SelectedStation . Id ,
"When starting app selected station must always be invlid" ) ;
// Verify bikes at station.
Assert . AreEqual (
0 ,
TestHelper . GetBikesAtStation ( l_oTinkApp . ActiveUser , l_oConnector , l_oTinkApp . SelectedStation . Id ) . Result . Count ,
"If no station is selected BikesAtStation- list count must be zero" ) ;
// Check my bikes
Assert . IsTrue ( l_oTinkApp . ActiveUser . IsLoggedIn ) ;
}
[Test]
public void LoggedIn_AllBikesDisposable_FilterKonrad ( )
{
var l_oCopriServer = new CopriCallsMemory ( SampleSets . Set2 , 1 ) ;
var l_oConnector = new ConnectorCache (
"1234" ,
"mgrimm@gmail.com" ,
new CopriCallsMemory ( SampleSets . Set2 , 1 ) ) ;
// No user logged in is initial state to verify.
var l_oTinkApp = new TinkApp (
new TINK . Model . Settings . Settings (
2021-11-14 23:27:29 +01:00
new GroupFilterMapPage ( new Dictionary < string , FilterState > { { FilterHelper . FILTERKONRAD , FilterState . On } } ) ,
new GroupFilterSettings ( new Dictionary < string , FilterState > { { FilterHelper . FILTERTINKGENERAL , FilterState . On } , { FilterHelper . FILTERKONRAD , FilterState . On } } ) ,
2021-07-12 21:31:46 +02:00
new Uri ( "https://app.tink-konstanz.de/APIjsonserver" ) ,
new TINK . Settings . PollingParameters ( new TimeSpan ( 10000 ) , true ) ,
Serilog . Events . LogEventLevel . Error ,
activeLockService : typeof ( LocksServiceMock ) . FullName ,
activeGeolocationService : typeof ( GeolocationMock ) . FullName ) ,
2021-11-14 23:27:29 +01:00
new StoreMock ( new Account ( "mgrimm@gmail.com" , "123456789" /* password */ , "1234" /* session cookie */ , new List < string > { FilterHelper . FILTERTINKGENERAL , FilterHelper . FILTERKONRAD } ) ) ,
2022-01-04 18:59:16 +01:00
( isConnected , uri , sessionCookie , mail , expiresAfter ) = > new ConnectorCache ( new AppContextInfo ( "MyMerchId" , "MyApp" , new Version ( 1 , 2 ) ) , sessionCookie , mail , new CopriCallsMemory001 ( ) ) ,
2021-07-12 21:31:46 +02:00
Substitute . For < IServicesContainer < IGeolocation > > ( ) ,
new LocksServiceMock ( ) ,
new DeviceMock ( ) ,
new SpecialFolderMock ( ) ,
null , // Cipher
2022-04-10 17:38:34 +02:00
Substitute . For < ILocationPermission > ( ) ,
2021-07-12 21:31:46 +02:00
isConnectedFunc : ( ) = > true ,
currentVersion : new Version ( 3 , 2 , 0 , 115 ) ,
lastVersion : new Version ( 3 , 0 , 173 ) ) ; // Current app version. Must be larger or equal 3.0.173 to
var l_oStations = l_oTinkApp . GetConnector ( true ) . Query . GetBikesAndStationsAsync ( ) . Result . Response ;
// Check stations.
2021-11-14 23:27:29 +01:00
Assert . AreEqual ( 27 , l_oStations . StationsAll . Count ) ;
Assert . NotNull ( l_oStations . StationsAll . GetById ( "KN1" ) ) ; // Former station id was 14 when bike was read from CopriCallsMemory(SampleSets.Set2, 1)
Assert . AreEqual ( "KN1" , l_oStations . StationsAll . GetById ( "KN1" ) . Id ) ;
Assert . AreEqual ( new Position ( 47.66267 , 9.17262 ) , l_oStations . StationsAll . GetById ( "KN1" ) . Position ) ; // Former station was 47.66698054007847, 9.169303178787231
2021-07-12 21:31:46 +02:00
// Verify selected station.
Assert . AreEqual (
null ,
l_oTinkApp . SelectedStation . Id ,
"When starting app selected station must always be invlid" ) ;
// Verify bikes at station.
Assert . AreEqual (
0 ,
TestHelper . GetBikesAtStation ( l_oTinkApp . ActiveUser , l_oConnector , l_oTinkApp . SelectedStation . Id ) . Result . Count ,
"If no station is selected BikesAtStation- list count must be zero" ) ;
// Check my bikes
Assert . IsTrue ( l_oTinkApp . ActiveUser . IsLoggedIn ) ;
}
[Test, Ignore("Todo: Check if reserved bikes are released even if system is offline.")]
public void LoggedIn_BikesReserved_OfflineAfterStart ( )
{
}
/// <summary>
/// Test if Whats New logic works as expected. Form version 3.0.0.115 or smaller no Whats New dialog existed.
/// </summary>
[Test]
public void FirstInstall_WhatsNew ( )
{
var l_oAppVersion = new Version ( 3 , 2 , 0 , 120 ) ;
var l_oTinkApp = new TinkApp (
new TINK . Model . Settings . Settings (
new GroupFilterMapPage ( new Dictionary < string , FilterState > { { "TINK" , FilterState . On } } ) ,
new GroupFilterSettings ( new Dictionary < string , FilterState > { { "TINK" , FilterState . On } , { "Konrad" , FilterState . On } } ) ,
new Uri ( "https://shareeapp-primary.copri-bike.de/APIjsonserver" ) ,
new TINK . Settings . PollingParameters ( new TimeSpan ( 10000 ) , true ) ,
Serilog . Events . LogEventLevel . Error ) ,
new StoreMock ( ) ,
2022-01-04 18:59:16 +01:00
( isConnected , uri , sessionCookie , mail , expiresAfter ) = > new ConnectorCache ( new AppContextInfo ( "MyMerchId" , "MyApp" , new Version ( 1 , 2 ) ) , sessionCookie , mail , new CopriCallsMemory ( SampleSets . Set2 , 1 ) ) ,
2021-07-12 21:31:46 +02:00
Substitute . For < IServicesContainer < IGeolocation > > ( ) ,
null , // use default locks service
new DeviceMock ( ) ,
new SpecialFolderMock ( ) ,
null , // Cipher
2022-04-10 17:38:34 +02:00
Substitute . For < ILocationPermission > ( ) ,
2021-07-12 21:31:46 +02:00
#if ARENDI
Substitute . For < ICentral > ( ) ,
#endif
isConnectedFunc : ( ) = > true ,
currentVersion : l_oAppVersion , // Current app version
lastVersion : null , // Last version.
whatsNewShownInVersion : null ) ; // First install.
// Whats new page
Assert . IsFalse (
l_oTinkApp . WhatsNew . IsShowRequired ,
$"Whats new should not be displayed because first install has been detected." ) ;
// Call member which view model calls when using app.
l_oTinkApp . SetWhatsNewWasShown ( ) ;
// Whats new page
Assert . IsFalse (
l_oTinkApp . WhatsNew . IsShowRequired ,
$"Whats new should mot be displayed first install detected." ) ;
}
[Test]
public void Upgrade120_WhatsNew ( )
{
var l_oAppVersion = new Version ( 3 , 0 , 0 , 120 ) ;
Version lastVersion = new Version ( 3 , 0 , 0 , 116 ) ;
var l_oTinkApp = new TinkApp (
new TINK . Model . Settings . Settings (
new GroupFilterMapPage ( new Dictionary < string , FilterState > { { "TINK" , FilterState . On } } ) ,
new GroupFilterSettings ( new Dictionary < string , FilterState > { { "TINK" , FilterState . On } , { "Konrad" , FilterState . On } } ) ,
new Uri ( "https://shareeapp-primary.copri-bike.de/APIjsonserver" ) ,
new TINK . Settings . PollingParameters ( new TimeSpan ( 10000 ) , true ) ,
Serilog . Events . LogEventLevel . Error ) ,
new StoreMock ( ) ,
2022-01-04 18:59:16 +01:00
( isConnected , uri , sessionCookie , mail , expiresAfter ) = > new ConnectorCache ( new AppContextInfo ( "MyMerchId" , "MyApp" , new Version ( 1 , 2 ) ) , sessionCookie , mail , new CopriCallsMemory ( SampleSets . Set2 , 1 ) ) ,
2021-07-12 21:31:46 +02:00
Substitute . For < IServicesContainer < IGeolocation > > ( ) ,
null , // use default locks service
new DeviceMock ( ) ,
new SpecialFolderMock ( ) ,
null , // Cipher
2022-04-10 17:38:34 +02:00
Substitute . For < ILocationPermission > ( ) ,
2021-07-12 21:31:46 +02:00
#if ARENDI // Requires LockItArendi library.
Substitute . For < ICentral > ( ) ,
#endif
isConnectedFunc : ( ) = > true ,
currentVersion : l_oAppVersion , // Current app version
lastVersion : lastVersion ,
whatsNewShownInVersion : null ) ; // Whats new page was never shown.
// Whats new page
Assert . IsTrue (
l_oTinkApp . WhatsNew . IsShowRequired ,
$"Whats new should be displayed because app version is {l_oAppVersion} and version when \" Whats New \ " was shown last is {lastVersion} (null means never)." ) ;
// Call member which view model calls when using app.
l_oTinkApp . SetWhatsNewWasShown ( ) ;
// Whats new page
Assert . IsFalse (
l_oTinkApp . WhatsNew . IsShowRequired ,
$"Whats new should mot be displayed because app version is {l_oAppVersion} and version when \" Whats New \ " was shown last is {lastVersion} equals." ) ;
}
[Test]
public void SubsequentStart_WhatsNew ( )
{
var l_oAppVersion = new Version ( 3 , 2 , 0 , 115 ) ;
var l_oWhatsNewVersion = new Version ( 3 , 2 , 0 , 115 ) ;
var l_oTinkApp = new TinkApp (
new TINK . Model . Settings . Settings (
new GroupFilterMapPage ( new Dictionary < string , FilterState > { { "TINK" , FilterState . On } } ) ,
new GroupFilterSettings ( new Dictionary < string , FilterState > { { "TINK" , FilterState . On } , { "Konrad" , FilterState . On } } ) ,
new Uri ( "https://shareeapp-primary.copri-bike.de/APIjsonserver" ) ,
new TINK . Settings . PollingParameters ( new TimeSpan ( 10000 ) , true ) ,
Serilog . Events . LogEventLevel . Error ,
activeLockService : typeof ( TINK . Services . BluetoothLock . BLE . LockItByGuidService ) . FullName ,
2022-04-10 17:38:34 +02:00
activeGeolocationService : typeof ( TINK . Services . Geolocation . LastKnownGeolocationService ) . FullName ) ,
2021-07-12 21:31:46 +02:00
new StoreMock ( ) ,
2022-01-04 18:59:16 +01:00
( isConnected , uri , sessionCookie , mail , expiresAfter ) = > new ConnectorCache ( new AppContextInfo ( "MyMerchId" , "MyApp" , new Version ( 1 , 2 ) ) , sessionCookie , mail , new CopriCallsMemory ( SampleSets . Set2 , 1 ) ) ,
2021-07-12 21:31:46 +02:00
Substitute . For < IServicesContainer < IGeolocation > > ( ) ,
null , // use default locks service
new DeviceMock ( ) ,
new SpecialFolderMock ( ) ,
null , // Cipher
2022-04-10 17:38:34 +02:00
Substitute . For < ILocationPermission > ( ) ,
2021-07-12 21:31:46 +02:00
#if ARENDI // Requires LockItArendi library.
Substitute . For < ICentral > ( ) ,
#endif
isConnectedFunc : ( ) = > true ,
currentVersion : l_oAppVersion , // Current app version<
lastVersion : l_oWhatsNewVersion ) ; // Whats new page was never shown.
// Whats new page
Assert . IsFalse (
l_oTinkApp . WhatsNew . IsShowRequired ,
$"Whats new should not be displayed because app version is {l_oAppVersion} and version when \" Whats New \ " was shown last is {l_oWhatsNewVersion} equals." ) ;
// Call member which view model would call if Whats New would have been shonw.
l_oTinkApp . SetWhatsNewWasShown ( ) ;
// Whats new page
Assert . IsFalse (
l_oTinkApp . WhatsNew . IsShowRequired ,
$"Whats new should mot be displayed because app version is {l_oAppVersion} and version when \" Whats New \ " was shown last is {l_oWhatsNewVersion} equals." ) ;
}
}
}