Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Upgrade to target .net8.0. Fixed tests and sample app. #17

Open
wants to merge 8 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
18 changes: 10 additions & 8 deletions src/FreshMvvm.Maui/FreshMvvm.Maui.csproj
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows')) and '$(MSBuildRuntimeType)' == 'Full'">$(TargetFrameworks);net6.0-windows10.0.19041</TargetFrameworks>
<TargetPlatformMinVersion Condition="$(TargetFramework.Contains('-windows'))">10.0.17763.0</TargetPlatformMinVersion>
<TargetFrameworks>net8.0;net8.0-android;net8.0-ios;net8.0-maccatalyst</TargetFrameworks>
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net8.0-windows10.0.19041.0</TargetFrameworks>
<UseMaui>true</UseMaui>
<SingleProject>true</SingleProject>

<SupportedOSPlatformVersion Condition="'$(TargetFramework)' == 'net6.0-ios'">14.2</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="'$(TargetFramework)' == 'net6.0-maccatalyst'">14.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="'$(TargetFramework)' == 'net6.0-android'">21.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$(TargetFramework.Contains('-windows'))">10.0.18362.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">14.2</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'">14.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">21.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</SupportedOSPlatformVersion>
<TargetPlatformMinVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</TargetPlatformMinVersion>

<Authors>rid00z</Authors>
<PackageId>FreshMvvm.Maui</PackageId>
Expand All @@ -31,6 +31,8 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Maui.Controls" Version="$(MauiVersion)" />
<PackageReference Include="Microsoft.Maui.Controls.Compatibility" Version="$(MauiVersion)" />
<PackageReference Include="System.Reactive" Version="5.0.0" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,8 @@ protected virtual void CreateMenuPage (string menuPageTitle, string menuIcon = n
Detail = _pages [(string)args.SelectedItem];
}

IsPresented = false;
if (!((IFlyoutPageController)this).ShouldShowSplitMode)
IsPresented = false;
};

_menuPage.Content = _listView;
Expand Down
94 changes: 59 additions & 35 deletions src/FreshMvvm.Tests/Fixtures/FreshPageModelResolverFixture.cs
Original file line number Diff line number Diff line change
@@ -1,44 +1,68 @@
using System;
using FluentAssertions.Common;
using FreshMvvm.Maui;
using FreshMvvm.Tests.Mocks;
using Microsoft.Extensions.DependencyInjection;
using NUnit.Framework;

namespace FreshMvvm.Tests.Fixtures
{
[TestFixture]
public class FreshPageModelResolverFixture
{
[TestCase]
public void Test_ResolvePageModel_Not_Found()
{
Assert.Throws<Exception>(() =>
{
FreshPageModelResolver.ResolvePageModel<MockFreshBasePageModel>();
});
}

[TestCase]
public void Test_ResolvePageModel()
{
var page = FreshPageModelResolver.ResolvePageModel<MockContentPageModel>();
var context = page.BindingContext as MockContentPageModel;

Assert.IsNotNull(context);
Assert.IsNotNull(context.CurrentPage);
Assert.IsNotNull(context.CoreMethods);
}

[TestCase("test data")]
public void Test_ResolvePageModel_With_Init(object data)
{
var page = FreshPageModelResolver.ResolvePageModel<MockContentPageModel>(data);
var context = page.BindingContext as MockContentPageModel;

Assert.IsNotNull(context);
Assert.IsNotNull(context.CurrentPage);
Assert.IsNotNull(context.CoreMethods);
Assert.AreSame(data, context.Data);
}
}
[TestFixture]
public class FreshPageModelResolverFixture
{
[TestCase]
public void Test_ResolvePageModel_Not_Found()
{
RegisterServices((services) => { /* Register nothing */ });

Assert.Throws<InvalidOperationException>(() =>
{
FreshPageModelResolver.ResolvePageModel<MockFreshBasePageModel>();
});
}

[TestCase]
public void Test_ResolvePageModel()
{
RegisterServices((services) =>
{
services.AddTransient<MockContentPageModel>();
services.AddTransient<MockContentPage>();
});

var page = FreshPageModelResolver.ResolvePageModel<MockContentPageModel>();
var context = page.BindingContext as MockContentPageModel;

Assert.IsNotNull(context);
Assert.IsNotNull(context.CurrentPage);
Assert.IsNotNull(context.CoreMethods);
}

[TestCase("test data")]
public void Test_ResolvePageModel_With_Init(object data)
{
RegisterServices((services) =>
{
services.AddTransient<MockContentPageModel>();
services.AddTransient<MockContentPage>();
});

var page = FreshPageModelResolver.ResolvePageModel<MockContentPageModel>(data);
var context = page.BindingContext as MockContentPageModel;

Assert.IsNotNull(context);
Assert.IsNotNull(context.CurrentPage);
Assert.IsNotNull(context.CoreMethods);
Assert.AreSame(data, context.Data);
}

void RegisterServices(Action<IServiceCollection> registerServices)
{
var services = new ServiceCollection();
registerServices(services);
var serivceProvider = services.BuildServiceProvider();
Maui.IOC.DependancyService.RegisterServiceProvider(serivceProvider);
}
}
}

39 changes: 34 additions & 5 deletions src/FreshMvvm.Tests/Fixtures/MultipleNavigationProviderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
using Microsoft.Maui.Controls;
using NSubstitute;
using FreshMvvm.Maui;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Maui.Dispatching;
using System.Threading.Tasks;

namespace FreshMvvm.Tests
{
Expand All @@ -26,6 +29,17 @@ public MultipleNavigationProviderTests ()
[Test]
public void pagemodel_should_be_link_to_when_created_firsttime()
{
RegisterServices((services) =>
{
services.AddTransient<MockContentPageModel>();
services.AddTransient<MockContentPage>();
});

// Mock the IDispatcherProvider which is needed in the ctor of
// a Maui ListView and TabbedPage
var dispatcherProvider = Substitute.For<IDispatcherProvider>();
DispatcherProvider.SetCurrent(dispatcherProvider);

//master detail navigation
var masterDetailNavigation = new FreshMasterDetailNavigationContainer();
masterDetailNavigation.AddPage<MockContentPageModel> ("Page1");
Expand Down Expand Up @@ -154,20 +168,20 @@ public void firstmodelchild_poped_popfrom_previous_navigation()

/// - when is someone pushes a new MasterDetail or TabbedPages, how do we go back, we need like a PopModalNavigation
[Test]
public void should_allow_popmodalnavigation()
public async Task should_allow_popmodalnavigation()
{
SetupFirstNavigationAndPage ();

PushSecondNavigationStack ();

_coreMethodsSecondPage.PushPageModel<MockContentPageModel> ();
await _coreMethodsSecondPage.PushPageModel<MockContentPageModel>(null, modal: true);

var pageModelLatest = _secondNavService.CurrentPage.BindingContext as FreshBasePageModel;

pageModelLatest.CoreMethods.PopModalNavigationService ();
await pageModelLatest.CoreMethods.PopModalNavigationService ();

//previousNavigation has pop modal called
_navigationMock.Received().PopPage(true);
await _navigationMock.Received().PopPage(true);
}

//TODO: test for this
Expand All @@ -182,9 +196,24 @@ public void should_allow_popmodalnavigation()
Page _page;
FreshBasePageModel _pageModel;

void RegisterServices(Action<IServiceCollection> registerServices)
{
var services = new ServiceCollection();
registerServices(services);
var serivceProvider = services.BuildServiceProvider();
Maui.IOC.DependancyService.RegisterServiceProvider(serivceProvider);
}

void SetupFirstNavigationAndPage()
{
_navigationMock = Substitute.For<IFreshNavigationService> ();
RegisterServices((services) =>
{
services.AddTransient<MockContentPageModel>();
services.AddTransient<MockContentPage>();
});

_navigationMock = Substitute.For<IFreshNavigationService>();

_page = FreshPageModelResolver.ResolvePageModel<MockContentPageModel>();
_pageModel = _page.BindingContext as MockContentPageModel;
_pageModel.SetCurrentNavigationService(_navigationMock);
Expand Down
58 changes: 38 additions & 20 deletions src/FreshMvvm.Tests/Fixtures/PageModelCoreMethodsFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,37 +4,55 @@
using NUnit.Framework;
using Microsoft.Maui.Controls;
using FreshMvvm.Maui;
using Microsoft.Extensions.DependencyInjection;
using System;

namespace FreshMvvm.Tests.Fixtures
{
[TestFixture]
class PageModelCoreMethodsFixture
{
PageModelCoreMethods _coreMethods;
IFreshNavigationService _navigationMock;
Page _page;
FreshBasePageModel _pageModel;
[TestFixture]
class PageModelCoreMethodsFixture
{
PageModelCoreMethods _coreMethods;
IFreshNavigationService _navigationMock;
Page _page;
FreshBasePageModel _pageModel;

void SetupFirstNavigationAndPage()
{
_navigationMock = Substitute.For<IFreshNavigationService>();
_page = FreshPageModelResolver.ResolvePageModel<MockContentPageModel>();
_pageModel = _page.BindingContext as MockContentPageModel;
_pageModel.SetCurrentNavigationService(_navigationMock);

_coreMethods = new PageModelCoreMethods(_page, _pageModel);
{
_navigationMock = Substitute.For<IFreshNavigationService>();
_page = FreshPageModelResolver.ResolvePageModel<MockContentPageModel>();
_pageModel = _page.BindingContext as MockContentPageModel;
_pageModel.SetCurrentNavigationService(_navigationMock);

_coreMethods = new PageModelCoreMethods(_page, _pageModel);
}

[Test]
public async Task model_property_populated_by_action()
{
public async Task model_property_populated_by_action()
{
RegisterServices((services) =>
{
services.AddTransient<MockContentPageModel>();
services.AddTransient<MockContentPage>();
services.AddTransient<MockItemPageModel>();
services.AddTransient<MockItemPage>();
});

SetupFirstNavigationAndPage();

const string item = "asj";
await _coreMethods.PushPageModel<MockItemPageModel>(pm => pm.Item = item);
const string item = "asj";
await _coreMethods.PushPageModel<MockItemPageModel>(pm => pm.Item = item);

_navigationMock.Received().PushPage(Arg.Any<Page>(), Arg.Is<MockItemPageModel>(o => o.Item == item), Arg.Any<bool>(), Arg.Any<bool>());
}

_navigationMock.Received().PushPage(Arg.Any<Page>(), Arg.Is<MockItemPageModel>(o => o.Item == item), Arg.Any<bool>(), Arg.Any<bool>());
void RegisterServices(Action<IServiceCollection> registerServices)
{
var services = new ServiceCollection();
registerServices(services);
var serivceProvider = services.BuildServiceProvider();
Maui.IOC.DependancyService.RegisterServiceProvider(serivceProvider);
}
}
}
4 changes: 3 additions & 1 deletion src/FreshMvvm.Tests/FreshMvvm.Tests.csproj
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<UseMaui>true</UseMaui>
<IsPackable>false</IsPackable>
<ReleaseVersion>0.4</ReleaseVersion>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Maui.Controls" Version="$(MauiVersion)" />
<PackageReference Include="Microsoft.Maui.Controls.Compatibility" Version="$(MauiVersion)" />
<PackageReference Include="FluentAssertions" Version="6.1.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" />
<PackageReference Include="Moq" Version="4.16.1" />
Expand Down
12 changes: 6 additions & 6 deletions src/FreshMvvmApp/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ namespace FreshMvvmApp
{
public partial class App : Application
{
public App()
public App()
{
MainPage = new NavigationPage(new LaunchPage(this));
}
Expand All @@ -23,7 +23,7 @@ public void LoadBasicNav()
public void LoadMasterDetail()
{
var masterDetailNav = new FreshMasterDetailNavigationContainer();
masterDetailNav.Init("Menu", "Menu.png");
masterDetailNav.Init("Menu", "menu");
masterDetailNav.AddPage<ContactListPageModel>("Contacts", null);
masterDetailNav.AddPage<QuoteListPageModel>("Quotes", null);
MainPage = masterDetailNav;
Expand All @@ -32,16 +32,16 @@ public void LoadMasterDetail()
public void LoadTabbedNav()
{
var tabbedNavigation = new FreshTabbedNavigationContainer();
tabbedNavigation.AddTab<ContactListPageModel>("Contacts", "contacts.png", null);
tabbedNavigation.AddTab<QuoteListPageModel>("Quotes", "document.png", null);
tabbedNavigation.AddTab<ContactListPageModel>("Contacts", "contacts", null);
tabbedNavigation.AddTab<QuoteListPageModel>("Quotes", "document", null);
MainPage = tabbedNavigation;
}

public void LoadFOTabbedNav()
{
var tabbedNavigation = new FreshTabbedFONavigationContainer("CRM");
tabbedNavigation.AddTab<ContactListPageModel>("Contacts", "contacts.png", null);
tabbedNavigation.AddTab<QuoteListPageModel>("Quotes", "document.png", null);
tabbedNavigation.AddTab<ContactListPageModel>("Contacts", "contacts", null);
tabbedNavigation.AddTab<QuoteListPageModel>("Quotes", "document", null);
MainPage = tabbedNavigation;
}

Expand Down
Loading