#region Using Statements
using System;
using System.IO;
using ANX.Framework.NonXNA;
using NUnit.Framework;
#endregion // Using Statements

using XNAKeyboardState = Microsoft.Xna.Framework.Input.KeyboardState;
using ANXKeyboardState = ANX.Framework.Input.KeyboardState;

using XNAKeys = Microsoft.Xna.Framework.Input.Keys;
using ANXKeys = ANX.Framework.Input.Keys;



#region License

//
// This file is part of the ANX.Framework created by the "ANX.Framework developer group".
//
// This file is released under the Ms-PL license.
//
//
//
// Microsoft Public License (Ms-PL)
//
// This license governs use of the accompanying software. If you use the software, you accept this license. 
// If you do not accept the license, do not use the software.
//
// 1.Definitions
//   The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning 
//   here as under U.S. copyright law.
//   A "contribution" is the original software, or any additions or changes to the software.
//   A "contributor" is any person that distributes its contribution under this license.
//   "Licensed patents" are a contributor's patent claims that read directly on its contribution.
//
// 2.Grant of Rights
//   (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations 
//       in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to 
//       reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution
//       or any derivative works that you create.
//   (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in 
//       section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed
//       patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution 
//       in the software or derivative works of the contribution in the software.
//
// 3.Conditions and Limitations
//   (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks.
//   (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your 
//       patent license from such contributor to the software ends automatically.
//   (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution 
//       notices that are present in the software.
//   (D) If you distribute any portion of the software in source code form, you may do so only under this license by including
//       a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or 
//       object code form, you may only do so under a license that complies with this license.
//   (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees,
//       or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the
//       extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a 
//       particular purpose and non-infringement.

#endregion // License
namespace ANX.Framework.TestCenter.Strukturen.Input
{
    [TestFixture]
    class KeyboardStateTest
    {
#region Input
               static object[] Key =
        {
         0, 8,9,13,19,20,21,25,27,28,
         29,
        32,
        33,
        34,
        35,
        36,
         37,
        38,
          39,
         40,
         41,
        42,
         43,
        44,
         45,
        46,
        47,
         48,
         49,
         50,
         51,
         52,
         53,
         54,
         55,
         56,
         57,
        65,
        66,
        67,
        68,
        69,
        70,
        71,
        72,
        73,
        74,
        75,
        76,
        77,
        78,
        79,
        80,
        81,
        82,
        83,
        84,
        85,
        86,
        87,
        88,
        89,
        90,
        91,
        92,
         93,
        95,
        96,
        97,
        98,
        99,
        100,
        101,
        102,
        103,
        104,
        105,
         106,
         107,
         108,
         109,
         110,
        111,
         112,
         113,
         114,
         115,
         116,
         117,
         118,
         119,
         120,
        121,
        122,
        123,
        124,
        125,
        126,
        127,
        128,
        129,
        130,
        131,
        132,
        133,
        134,
        135,
         144,
        145,
        160,
         161,
         162,
         163,
         164,
        165,
         166,
         167,
        168,
         169,
        170,
        171,
         172,
        173,
        174,
        175,
        176,
        177,
         178,
         179,
        180,
         181,
         182,
         183,
         186,
        187,
         188,
         189,
         190,
          191,
        192,
         202,
         203,
        219,
        220,
         221,
         222,
        223,
         226,
         229,
        242,
        243,
        244,
        246,
         247,
         248,
         249,
        250,
        251,
        253,
         254
        };

        static object[] Key10 =
        {
           new int[]{9,32,33,34,35,36,37,38,39,40},
           new int[]{9,9,9,34,35,36,37,38,39,40},        
           new int[]{9,42,9,34,35,36,37,38,39,40},
           new int[]{9,42,43,34,35,36,37,38,39,40},
        };
#endregion

        [TestCaseSource("Key")]
        public void IsKeyDown(int key)
        {
            ANXKeys[] anxkey = new ANXKeys[1];
            XNAKeys[] xnakey = new XNAKeys[1];
            anxkey[0] = (ANXKeys)key;
            xnakey[0] = (XNAKeys)key;
            ANXKeyboardState anx = new ANXKeyboardState(anxkey);
            XNAKeyboardState xna = new XNAKeyboardState(xnakey);
            AssertHelper.ConvertEquals(xna.IsKeyDown((XNAKeys)key), anx.IsKeyDown((ANXKeys)key),"IsKeyDown" );
        }

        [TestCaseSource("Key")]
        public void IsKeyUp(int key)
        {
            ANXKeys[] anxkey = new ANXKeys[1];
            XNAKeys[] xnakey = new XNAKeys[1];
            anxkey[0] = (ANXKeys)key;
            xnakey[0] = (XNAKeys)key;
            ANXKeyboardState anx = new ANXKeyboardState(anxkey);
            XNAKeyboardState xna = new XNAKeyboardState(xnakey);
            AssertHelper.ConvertEquals(xna.IsKeyUp((XNAKeys)key), anx.IsKeyUp((ANXKeys)key), "IsKeyUp");
        }

        [TestCaseSource("Key10")]
        public void opEqual(int[] key)
        {
            ANXKeys[] anxkey = new ANXKeys[10];
            
            XNAKeys[] xnakey = new XNAKeys[10];
            for (int i = 0; i < key.Length; i++)
            {
                anxkey[i] = (ANXKeys)key[i];
                xnakey[i] = (XNAKeys)key[i];

            }
            ANXKeyboardState anx = new ANXKeyboardState(anxkey);
            XNAKeyboardState xna = new XNAKeyboardState(xnakey);
            ANXKeyboardState anx2 = new ANXKeyboardState(anxkey);
            XNAKeyboardState xna2 = new XNAKeyboardState(xnakey);

            AssertHelper.ConvertEquals(xna == xna2, anx == anx2, "opequal");
        }

        [TestCaseSource("Key10")]
        public void Equals(int[] key)
        {
            ANXKeys[] anxkey = new ANXKeys[10];

            XNAKeys[] xnakey = new XNAKeys[10];
            for (int i = 0; i < key.Length; i++)
            {
                anxkey[i] = (ANXKeys)key[i];
                xnakey[i] = (XNAKeys)key[i];

            }
            ANXKeyboardState anx = new ANXKeyboardState(anxkey);
            XNAKeyboardState xna = new XNAKeyboardState(xnakey);
            ANXKeyboardState anx2 = new ANXKeyboardState(anxkey);
            XNAKeyboardState xna2 = new XNAKeyboardState(xnakey);

            AssertHelper.ConvertEquals(xna.Equals(xna2), anx.Equals(anx2), "Equals");
        }

        [TestCaseSource("Key10")]
        public void Equals2(int[] key)
        {
            ANXKeys[] anxkey = new ANXKeys[10];

            XNAKeys[] xnakey = new XNAKeys[10];
            for (int i = 0; i < key.Length; i++)
            {
                anxkey[i] = (ANXKeys)key[i];
                xnakey[i] = (XNAKeys)key[i];

            }
            ANXKeyboardState anx = new ANXKeyboardState(anxkey);
            XNAKeyboardState xna = new XNAKeyboardState(xnakey);

            AssertHelper.ConvertEquals(xna.Equals(null), anx.Equals(null), "Equals2");
        }

        [TestCaseSource("Key10")]
        public void opEqual2(int[] key)
        {
            ANXKeys[] anxkey = new ANXKeys[10];

            XNAKeys[] xnakey = new XNAKeys[10];
            for (int i = 0; i < key.Length; i++)
            {
                anxkey[i] = (ANXKeys)key[i];
                xnakey[i] = (XNAKeys)key[i];

            }
            ANXKeyboardState anx = new ANXKeyboardState(anxkey);
            XNAKeyboardState xna = new XNAKeyboardState(xnakey);
            anxkey[9] = (ANXKeys)9;
            xnakey[9] = (XNAKeys)9;
            XNAKeyboardState xna2 = new XNAKeyboardState(xnakey);
            ANXKeyboardState anx2 = new ANXKeyboardState(anxkey);

            AssertHelper.ConvertEquals(xna == xna2, anx == anx2, "opequal2");
        }

        [TestCaseSource("Key10")]
        public void opEqual3(int[] key)
        {
            ANXKeys[] anxkey = new ANXKeys[10];

            XNAKeys[] xnakey = new XNAKeys[10];
            for (int i = 0; i < key.Length; i++)
            {
                anxkey[i] = (ANXKeys)key[i];
                xnakey[i] = (XNAKeys)key[i];

            }
            ANXKeyboardState anx = new ANXKeyboardState(anxkey);
            XNAKeyboardState xna = new XNAKeyboardState(xnakey);
            ANXKeyboardState anx2 = new ANXKeyboardState(new ANXKeys[0]);
            XNAKeyboardState xna2 = new XNAKeyboardState(new XNAKeys[0]);

            AssertHelper.ConvertEquals(xna == xna2, anx == anx2, "opequal3");
        }

        [TestCaseSource("Key10")]
        public void opInEqual3(int[] key)
        {
            ANXKeys[] anxkey = new ANXKeys[10];

            XNAKeys[] xnakey = new XNAKeys[10];
            for (int i = 0; i < key.Length; i++)
            {
                anxkey[i] = (ANXKeys)key[i];
                xnakey[i] = (XNAKeys)key[i];

            }
            ANXKeyboardState anx = new ANXKeyboardState(anxkey);
            XNAKeyboardState xna = new XNAKeyboardState(xnakey);
            ANXKeyboardState anx2 = new ANXKeyboardState(new ANXKeys[0]);
            XNAKeyboardState xna2 = new XNAKeyboardState(new XNAKeys[0]);

            AssertHelper.ConvertEquals(xna != xna2, anx != anx2, "opequal3");
        }

        [TestCaseSource("Key10")]
        public void GetPressedKeys(int[] key)
        {
            ANXKeys[] anxkey = new ANXKeys[10];

            XNAKeys[] xnakey = new XNAKeys[10];
            for (int i = 0; i < key.Length; i++)
            {
                anxkey[i] = (ANXKeys)key[i];
                xnakey[i] = (XNAKeys)key[i];

            }
            ANXKeyboardState anx = new ANXKeyboardState(anxkey);
            XNAKeyboardState xna = new XNAKeyboardState(xnakey);

            AssertHelper.ConvertEquals(xna.GetPressedKeys(), anx.GetPressedKeys(), "GetPressedKeys");
        }
 
        [TestCaseSource("Key10")]
        public void KeyState(int[] key)
        {
            ANXKeys[] anxkey = new ANXKeys[10];

            XNAKeys[] xnakey = new XNAKeys[10];
            for (int i = 0; i < key.Length; i++)
            {
                anxkey[i] = (ANXKeys)key[i];
                xnakey[i] = (XNAKeys)key[i];

            }
            ANXKeyboardState anx = new ANXKeyboardState(anxkey);
            XNAKeyboardState xna = new XNAKeyboardState(xnakey);

            AssertHelper.ConvertEquals(xna[(XNAKeys)9]==Microsoft.Xna.Framework.Input.KeyState.Down, anx[(ANXKeys)9]==ANX.Framework.Input.KeyState.Down, "KeyState");
        }
    }
}