public void QuickButtonPositionOverMultipleSessions()
        {
            var cursorApiMock   = new CursorApiMock();
            var keyboardKeyMock = new KeyboardKeyApiMock();
            var session         = new SessionBuilder()
                                  .WithScreenDimensions(800, 600)
                                  .WithApiMock(cursorApiMock)
                                  .WithApiMock(keyboardKeyMock)
                                  .WithGH()
                                  .Build();

            session.RunStartup();

            var ghTestable = new GHAddOnTestable(session);

            var buttonLocation = ghTestable.GetMainButtonLocation();
            var distToExpected = GetDist(buttonLocation.Item1, buttonLocation.Item2, 600, 450);

            Assert.IsTrue(distToExpected < 30, $"The main button was not located as expected. Distance from actual to expected: {distToExpected}.");

            ghTestable.MouseOverMainButton();
            cursorApiMock.SetPosition(600, 450);
            keyboardKeyMock.ShiftKeyDown = true;
            ghTestable.StartDragMainButton();
            session.RunUpdate();
            cursorApiMock.SetPosition(550, 300);
            session.RunUpdate();
            cursorApiMock.SetPosition(500, 100);
            session.RunUpdate();
            ghTestable.StopDragMainButton();
            keyboardKeyMock.ShiftKeyDown = false;

            var buttonLocationAfterMove = ghTestable.GetMainButtonLocation();
            var distToExpectedAfterMove = GetDist(buttonLocationAfterMove.Item1, buttonLocationAfterMove.Item2, 500, 100);

            Assert.IsTrue(distToExpectedAfterMove < 30, $"The main button was not located as expected. Distance from actual to expected: {distToExpectedAfterMove}.");

            var savedVars = session.GetSavedVariables();

            var cursorApiMock2 = new CursorApiMock();
            var session2       = new SessionBuilder()
                                 .WithScreenDimensions(800, 600)
                                 .WithApiMock(cursorApiMock2)
                                 .WithSavedVariables(savedVars)
                                 .WithGH()
                                 .Build();

            var ghTestable2 = new GHAddOnTestable(session2);

            var buttonLocation2 = ghTestable2.GetMainButtonLocation();
            var distToExpected2 = GetDist(buttonLocation2.Item1, buttonLocation2.Item2, 500, 100);

            Assert.IsTrue(distToExpected2 < 30, $"The main button was not located as expected. Distance from actual to expected: {distToExpected2}.");
        }
        public void ProfileWithAdditionalFieldsTest()
        {
            var session = new SessionBuilder()
                          .WithPlayerName("Tester")
                          .WithPlayerClass("Priest")
                          .WithPlayerGuid("g1")
                          .WithPlayerRace("Human")
                          .WithPlayerSex(2)
                          .WithGH()
                          .WithGHF()
                          .Build();

            session.RunStartup();

            var ghTestable   = new GHAddOnTestable(session);
            var menuTestable = new GHMenuTestable(session);

            ghTestable.MouseOverMainButton();
            ghTestable.ClickSubButton("Interface\\Icons\\Spell_Misc_EmotionHappy");

            menuTestable.SelectMenu("GHF_CharacterMenu");

            session.Actor.Click("Add Additional Fields");
            session.Actor.Click("Title");

            menuTestable.VerifyLabelVisible("Title:");
            menuTestable.SetObjectValue("Title:", "Cleric");

            session.Actor.Click("Add Additional Fields");
            session.Actor.Click("Age");

            menuTestable.VerifyLabelVisible("Age:");
            menuTestable.SetObjectValue("Age:", "52");

            menuTestable.CloseMenu();

            var savedVars = session.GetSavedVariables();

            var savedProfiles    = (NativeLuaTable)savedVars[ModelProvider.SavedAccountProfiles];
            var additionalFields = TestUtil.GetTableValue <Profile>(savedProfiles, "Tester", "obj").AdditionalFields;

            Assert.AreEqual("Cleric", additionalFields["title"]);
            Assert.AreEqual("52", additionalFields["age"]);
        }
        public void MultiCharProfileLifecycle()
        {
            var session = new SessionBuilder()
                          .WithPlayerName("Tester")
                          .WithPlayerClass("Mage")
                          .WithPlayerGuid("g1")
                          .WithPlayerRace("Human")
                          .WithPlayerSex(2)
                          .WithGH()
                          .WithGHF()
                          .Build();

            session.RunStartup();

            var ghTestable   = new GHAddOnTestable(session);
            var menuTestable = new GHMenuTestable(session);

            ghTestable.MouseOverMainButton();
            ghTestable.ClickSubButton("Interface\\Icons\\Spell_Misc_EmotionHappy");

            menuTestable.SelectMenu("GHF_CharacterMenu");
            Assert.AreEqual("Tester", menuTestable.GetObjectValue("First Name:"));
            Assert.AreEqual("", menuTestable.GetObjectValue("Middle Name(s):"));
            Assert.AreEqual("", menuTestable.GetObjectValue("Last Name:"));

            menuTestable.SetObjectValue("First Name:", "Testperson");
            menuTestable.SetObjectValue("Middle Name(s):", "von der");
            menuTestable.SetObjectValue("Last Name:", "Testa");

            menuTestable.CloseMenu();

            var savedVars = session.GetSavedVariables();

            var session2 = new SessionBuilder()
                           .WithPlayerName("Pilus")
                           .WithPlayerClass("Warrior")
                           .WithPlayerGuid("g2")
                           .WithPlayerRace("Human")
                           .WithPlayerSex(2)
                           .WithGH()
                           .WithGHF()
                           .WithSavedVariables(savedVars)
                           .Build();

            session2.RunStartup();

            var ghTestable2   = new GHAddOnTestable(session2);
            var menuTestable2 = new GHMenuTestable(session2);

            ghTestable2.MouseOverMainButton();
            ghTestable2.ClickSubButton("Interface\\Icons\\Spell_Misc_EmotionHappy");

            menuTestable2.SelectMenu("GHF_CharacterMenu");
            Assert.AreEqual("Pilus", menuTestable2.GetObjectValue("First Name:"));
            Assert.AreEqual("", menuTestable2.GetObjectValue("Middle Name(s):"));
            Assert.AreEqual("", menuTestable2.GetObjectValue("Last Name:"));

            session2.Actor.Click("Interface\\Buttons\\UI-SpellbookIcon-PrevPage-Up");
            session2.Actor.VerifyVisible("Testperson von der Testa");
            session2.Actor.VerifyVisible("Interface\\Icons\\INV_Staff_13"); // Mage
            session2.Actor.VerifyVisible("Pilus");
            session2.Actor.VerifyVisible("Interface\\Icons\\INV_Sword_27"); // Warrior
        }
        public void SimpleProfileLifecycle()
        {
            var session = new SessionBuilder()
                          .WithPlayerName("Tester")
                          .WithPlayerClass("Druid")
                          .WithPlayerGuid("g1")
                          .WithPlayerRace("Human")
                          .WithPlayerSex(2)
                          .WithGH()
                          .WithGHF()
                          .Build();

            session.RunStartup();

            var ghTestable   = new GHAddOnTestable(session);
            var menuTestable = new GHMenuTestable(session);

            ghTestable.MouseOverMainButton();
            ghTestable.ClickSubButton("Interface\\Icons\\Spell_Misc_EmotionHappy");

            menuTestable.SelectMenu("GHF_CharacterMenu");
            Assert.AreEqual("Tester", menuTestable.GetObjectValue("First Name:"));
            Assert.AreEqual("", menuTestable.GetObjectValue("Middle Name(s):"));
            Assert.AreEqual("", menuTestable.GetObjectValue("Last Name:"));
            Assert.AreEqual("", menuTestable.GetObjectValue("Background:"));

            menuTestable.SetObjectValue("First Name:", "Testperson");
            menuTestable.SetObjectValue("Middle Name(s):", "von der");
            menuTestable.SetObjectValue("Last Name:", "Testa");
            menuTestable.SetObjectValue("Appearance:", "Looks");
            menuTestable.SetObjectValue("Background:", "Background story.");

            menuTestable.CloseMenu();

            var savedVars = session.GetSavedVariables();

            var session2 = new SessionBuilder()
                           .WithPlayerName("Tester")
                           .WithPlayerClass("Druid")
                           .WithPlayerGuid("g1")
                           .WithPlayerRace("Human")
                           .WithPlayerSex(2)
                           .WithGH()
                           .WithGHF()
                           .WithSavedVariables(savedVars)
                           .Build();

            session2.RunStartup();

            var ghTestable2   = new GHAddOnTestable(session2);
            var menuTestable2 = new GHMenuTestable(session2);

            ghTestable2.MouseOverMainButton();
            ghTestable2.ClickSubButton("Interface\\Icons\\Spell_Misc_EmotionHappy");

            menuTestable2.SelectMenu("GHF_CharacterMenu");
            Assert.AreEqual("Testperson", menuTestable2.GetObjectValue("First Name:"));
            Assert.AreEqual("von der", menuTestable2.GetObjectValue("Middle Name(s):"));
            Assert.AreEqual("Testa", menuTestable2.GetObjectValue("Last Name:"));
            Assert.AreEqual("Looks", menuTestable2.GetObjectValue("Appearance:"));
            Assert.AreEqual("Background story.", menuTestable2.GetObjectValue("Background:"));
        }