// Copyright © 2017 The CefSharp Authors. All rights reserved.
//
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.

using System.Threading.Tasks;
using CefSharp.WinForms;
using Xunit;
using Xunit.Abstractions;

namespace CefSharp.Test.WinForms
{
    //NOTE: All Test classes must be part of this collection as it manages the Cef Initialize/Shutdown lifecycle
    [Collection(CefSharpFixtureCollection.Key)]
    public class WinFormsBrowserBasicFacts
    {
        private readonly ITestOutputHelper output;
        private readonly CefSharpFixture fixture;

        public WinFormsBrowserBasicFacts(ITestOutputHelper output, CefSharpFixture fixture)
        {
            this.fixture = fixture;
            this.output = output;
        }

        [WinFormsFact]
        public async Task CanLoadGoogle()
        {
            using (var browser = new ChromiumWebBrowser("www.google.com"))
            {
                browser.Size = new System.Drawing.Size(1024, 768);
                browser.CreateControl();

                await browser.LoadUrlAsync();

                var mainFrame = browser.GetMainFrame();
                Assert.True(mainFrame.IsValid);
                Assert.Contains("www.google", mainFrame.Url);

                output.WriteLine("Url {0}", mainFrame.Url);
            }
        }

        [WinFormsFact]
        public async Task CanSetBrowserSettingsDisableImageLoadingViaObjectFactory()
        {
            using (var browser = new ChromiumWebBrowser("www.google.com"))
            {
                var settings = Core.ObjectFactory.CreateBrowserSettings(true);
                settings.ImageLoading = CefState.Disabled;
                browser.BrowserSettings = settings;

                browser.Size = new System.Drawing.Size(1024, 768);
                browser.CreateControl();

                await browser.LoadUrlAsync();

                var mainFrame = browser.GetMainFrame();
                Assert.True(mainFrame.IsValid);
                Assert.Contains("www.google", mainFrame.Url);

                output.WriteLine("Url {0}", mainFrame.Url);
            }
        }

        [WinFormsFact]
        public async Task CanSetBrowserSettingsDisableImageLoading()
        {
            using (var browser = new ChromiumWebBrowser("www.google.com"))
            {
                browser.BrowserSettings = new BrowserSettings(true)
                {
                    ImageLoading = CefState.Disabled
                };

                browser.Size = new System.Drawing.Size(1024, 768);
                browser.CreateControl();

                await browser.LoadUrlAsync();

                var mainFrame = browser.GetMainFrame();
                Assert.True(mainFrame.IsValid);
                Assert.Contains("www.google", mainFrame.Url);

                output.WriteLine("Url {0}", mainFrame.Url);
            }
        }

        [WinFormsFact]
        public async Task CanSetRequestContextViaRequestContextBuilder()
        {
            using (var browser = new ChromiumWebBrowser("www.google.com"))
            {
                var settings = Core.ObjectFactory.CreateBrowserSettings(true);
                settings.ImageLoading = CefState.Disabled;
                browser.RequestContext = RequestContext.Configure().Create();

                browser.Size = new System.Drawing.Size(1024, 768);
                browser.CreateControl();

                await browser.LoadUrlAsync();

                var mainFrame = browser.GetMainFrame();
                Assert.True(mainFrame.IsValid);
                Assert.Contains("www.google", mainFrame.Url);

                output.WriteLine("Url {0}", mainFrame.Url);
            }
        }

        [WinFormsFact]
        public async Task CanSetRequestContext()
        {
            using (var browser = new ChromiumWebBrowser("www.google.com"))
            {
                browser.RequestContext = new RequestContext();

                browser.Size = new System.Drawing.Size(1024, 768);
                browser.CreateControl();

                await browser.LoadUrlAsync();

                var mainFrame = browser.GetMainFrame();
                Assert.True(mainFrame.IsValid);
                Assert.Contains("www.google", mainFrame.Url);

                output.WriteLine("Url {0}", mainFrame.Url);
            }
        }
    }
}
