﻿using Avalonia.Platform;
using Avalonia.Threading;
using Avalonia.UnitTests;
using Moq;
using Xunit;

namespace Avalonia.Controls.UnitTests;

public class LoadedTests
{
    [Fact]
    public void Window_Loads_And_Unloads()
    {
        // Some other tests are populating the queue and are not resetting the dispatcher, so we need to purge it
        Control.ResetLoadedQueueForUnitTests();
        using (UnitTestApplication.Start(TestServices.StyledWindow))
        {
            int loadedCount = 0, unloadedCount = 0;
            var target = new Window();

            target.Loaded += (_, _) => loadedCount++;
            target.Unloaded += (_, _) => unloadedCount++; 
            
            Assert.Equal(0, loadedCount);
            Assert.Equal(0, unloadedCount);
            
            target.Show();
            Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded);
            Assert.True(target.IsLoaded);

            Assert.Equal(1, loadedCount);
            Assert.Equal(0, unloadedCount);
            
            target.Close();
            
            Assert.Equal(1, loadedCount);
            Assert.Equal(1, unloadedCount);
            Assert.False(target.IsLoaded);
        }
    }
    
    [Fact]
    public void Control_Loads_And_Unloads()
    {
        // Some other tests are populating the queue and are not resetting the dispatcher, so we need to purge it
        Control.ResetLoadedQueueForUnitTests();
        using (UnitTestApplication.Start(TestServices.StyledWindow))
        {
            int loadedCount = 0, unloadedCount = 0;
            var window = new Window();
            window.Show();

            var target = new Button();

            target.Loaded += (_, _) => loadedCount++;
            target.Unloaded += (_, _) => unloadedCount++; 
            
            Assert.Equal(0, loadedCount);
            Assert.Equal(0, unloadedCount);
            
            window.Content = target;
            Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded);
            Assert.True(target.IsLoaded);

            Assert.Equal(1, loadedCount);
            Assert.Equal(0, unloadedCount);
            
            window.Content = null;
            
            Assert.Equal(1, loadedCount);
            Assert.Equal(1, unloadedCount);
            Assert.False(target.IsLoaded);
        }
    }
}
