using System;
using System.CodeDom;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
using Cosmos.TestRunner;
using Sys = Cosmos.System;

namespace SimpleStructsAndArraysTest
{
    public class Kernel: Sys.Kernel
    {
        protected override void BeforeRun()
        {
            Console.WriteLine("Cosmos booted successfully.");
        }

        //[StructLayout(LayoutKind.Explicit, Size = 10)]
        //private struct MyStruct
        //{
        //    public MyStruct(short a, short b, short c, short d, short e)
        //    {
        //        A = a;
        //        B = b;
        //        C = c;
        //        D = d;
        //        E = e;
        //    }

        //    [FieldOffset(0)]
        //    public short A;

        //    [FieldOffset(2)]
        //    public short B;

        //    [FieldOffset(4)]
        //    public short C;

        //    [FieldOffset(6)]
        //    public short D;

        //    [FieldOffset(8)]
        //    public short E;
        //}

        //private static T GetValue<T>(T[] arr, int index)
        //{
        //    return arr[index];
        //}

        //private static void TestStep1()
        //{
        //    //var xItem = xQueue.Dequeue();
        //    //Console.Write("Char: ");
        //    //Console.WriteLine(xResult.KeyChar);
        //    var xItem = new MyStruct
        //                {
        //                    A = 1,
        //                    B = 2,
        //                    C = 3,
        //                    D = 4,
        //                    E = 5
        //                };

        //    var xArray = new MyStruct[1];
        //    xArray[0] = xItem;
        //    //xArray[0] = new MyStruct(1, 2, 3, 4, 5);

        //    xItem = xArray[0];
        //    Assert.IsTrue(xItem.A == 1, "xItem.A == 1");
        //    Console.Write("A: ");
        //    Console.WriteLine(xItem.A);
        //    Assert.IsTrue(xItem.B == 2, "xItem.B == 2");
        //    Console.Write("B: ");
        //    Console.WriteLine(xItem.B);
        //    Assert.IsTrue(xItem.C == 3, "xItem.C == 3");
        //    Console.Write("C: ");
        //    Console.WriteLine(xItem.C);
        //    Assert.IsTrue(xItem.D == 4, "xItem.D == 4");
        //    Console.Write("D: ");
        //    Console.WriteLine(xItem.D);
        //    Assert.IsTrue(xItem.E == 5, "xItem.E == 5");
        //    Console.Write("E: ");
        //    Console.WriteLine(xItem.E);

        //    //xItem = new MyStruct(6, 7, 8, 9, 10);

        //    Console.WriteLine("Next: ");
        //    //xItem = xQueue.Dequeue();
        //    //Console.Write("Char: ");
        //    //Console.WriteLine(xResult.KeyChar);

        //    //var xArray = new MyStruct[0];
        //    //xArray[0] = new MyStruct(1, 2, 3, 4, 5);

        //    var xItem2 = GetValue(xArray, 0);
        //    Assert.IsTrue(xItem2.A == 1, "xItem2.A == 1");
        //    Console.Write("A: ");
        //    Console.WriteLine(xItem2.A);
        //    Assert.IsTrue(xItem2.B == 2, "xItem2.B == 2");
        //    Console.Write("B: ");
        //    Console.WriteLine(xItem2.B);
        //    Assert.IsTrue(xItem2.C == 3, "xItem2.C == 3");
        //    Console.Write("C: ");
        //    Console.WriteLine(xItem2.C);
        //    Assert.IsTrue(xItem2.D == 4, "xItem2.D == 4");
        //    Console.Write("D: ");
        //    Console.WriteLine(xItem2.D);
        //    Assert.IsTrue(xItem2.E == 5, "xItem2.E == 5");
        //    Console.Write("E: ");
        //    Console.WriteLine(xItem2.E);
        //}

        //private class KVPClass
        //{
        //    public int Key;
        //    public int Value;
        //}

        //private struct KVPStruct
        //{
        //    public int Key;
        //    public int Value;
        //}

        //private class OurList<T>
        //{
        //    private int _size;
        //    private int _version;
        //    private T[] _items;
        //    private object _syncRoot;

        //    public OurList()
        //    {
        //        this._items = new T[0];
        //    }
        //    public void Add(T item)
        //    {

        //        if (this._size == this._items.Length)
        //        {
        //            this.EnsureCapacity(this._size + 1);
        //        }
        //        T[] arg_36_0 = this._items;
        //        int size = this._size;
        //        this._size = size + 1;
        //        arg_36_0[size] = item;
        //        this._version++;
        //    }

        //    private void EnsureCapacity(int min)
        //    {
        //        if (this._items.Length < min)
        //        {
        //            int num = (this._items.Length == 0) ? 4 : (this._items.Length * 2);
        //            if (num > 2146435071)
        //            {
        //                num = 2146435071;
        //            }
        //            if (num < min)
        //            {
        //                num = min;
        //            }
        //            this.Capacity = num;
        //        }
        //    }

        //    public int Capacity
        //    {
        //        get
        //        {
        //            return this._items.Length;
        //        }
        //        set
        //        {
        //            if (value < this._size)
        //            {
        //                throw new Exception("Capacity is smaller than size!");
        //            }
        //            if (value != this._items.Length)
        //            {
        //                if (value > 0)
        //                {
        //                    T[] array = new T[value];
        //                    if (this._size > 0)
        //                    {
        //                        Array.Copy(this._items, 0, array, 0, this._size);
        //                    }
        //                    this._items = array;
        //                    return;
        //                }
        //                this._items = new T[0];
        //            }
        //        }
        //    }

        //    public T this[int index]
        //    {
        //        get
        //        {
        //            Assert.IsTrue(index == ExpectedIndex, "index == " + ExpectedIndex);
        //            if (index >= this._size)
        //            {
        //                throw new Exception("Out of range!");
        //            }
        //            return this._items[index];
        //        }
        //    }

        //    public static int ExpectedIndex;

        //}

        //protected static void TestOurList()
        //{
        //    Assert.IsTrue(true, "Start of test");
        //    var xListClasses = new OurList<KVPClass>();
        //    var xListStructs = new OurList<KVPStruct>();

        //    xListClasses.Add(new KVPClass {Key = 1, Value = 2});
        //    xListClasses.Add(new KVPClass {Key = 2, Value = 5});

        //    OurList<KVPClass>.ExpectedIndex = 0;
        //    var xListItem = xListClasses[0];
        //    Assert.AreEqual(1, xListItem.Key, "xListClasses[0].Key == 1");
        //    Assert.AreEqual(2, xListItem.Value, "xListClasses[0].Value == 2");
        //    OurList<KVPClass>.ExpectedIndex = 1;
        //    xListItem = xListClasses[1];
        //    Assert.AreEqual(2, xListItem.Key,   "xListClasses[1].Key == 2");
        //    Assert.AreEqual(5, xListItem.Value, "xListClasses[1].Value == 5");

        //    xListStructs.Add(new KVPStruct {Key = 1, Value = 2});
        //    xListStructs.Add(new KVPStruct {Key = 2, Value = 5});

        //    OurList<KVPStruct>.ExpectedIndex = 0;
        //    var xStructItem = xListStructs[0];
        //    Assert.AreEqual(1, xStructItem.Key, "xListStructs[0].Key == 1");
        //    Assert.AreEqual(2, xStructItem.Value, "xListStructs[0].Value == 2");
        //    OurList<KVPStruct>.ExpectedIndex = 1;
        //    xStructItem = xListStructs[1];
        //    Assert.AreEqual(2, xStructItem.Key, "xListStructs[1].Key == 2");
        //    Assert.AreEqual(5, xStructItem.Value, "xListStructs[1].Value == 5");
        //}

        //protected static void TestStandardList()
        //{
        //    Assert.IsTrue(true, "Start of test");
        //    var xListClasses = new List<KVPClass>();
        //    var xListStructs = new List<KVPStruct>();

        //    xListClasses.Add(new KVPClass { Key = 1, Value = 2 });
        //    xListClasses.Add(new KVPClass { Key = 2, Value = 5 });

        //    var xListItem = xListClasses[0];
        //    Assert.AreEqual(1, xListItem.Key, "xListClasses[0].Key == 1");
        //    Assert.AreEqual(2, xListItem.Value, "xListClasses[0].Value == 2");
        //    xListItem = xListClasses[1];
        //    Assert.AreEqual(2, xListItem.Key, "xListClasses[1].Key == 2");
        //    Assert.AreEqual(5, xListItem.Value, "xListClasses[1].Value == 5");

        //    xListStructs.Add(new KVPStruct { Key = 1, Value = 2 });
        //    xListStructs.Add(new KVPStruct { Key = 2, Value = 5 });

        //    var xStructItem = xListStructs[0];
        //    Assert.AreEqual(1, xStructItem.Key, "xListStructs[0].Key == 1");
        //    Assert.AreEqual(2, xStructItem.Value, "xListStructs[0].Value == 2");
        //    xStructItem = xListStructs[1];
        //    Assert.AreEqual(2, xStructItem.Key, "xListStructs[1].Key == 2");
        //    Assert.AreEqual(5, xStructItem.Value, "xListStructs[1].Value == 5");
        //}

        //protected static void TestMultidimensionalArray()
        //{
        //    var xTestMultidimensionalArray = new int[2, 2];
        //    xTestMultidimensionalArray[0, 0] = 1;
        //    xTestMultidimensionalArray[0, 1] = 2;
        //    xTestMultidimensionalArray[1, 0] = 3;
        //    xTestMultidimensionalArray[1, 1] = 4;
        //    Assert.IsTrue(xTestMultidimensionalArray.Length == 4, "Size of array is 4.");
        //    Assert.IsTrue(xTestMultidimensionalArray[0, 0] == 1, "Index [0, 0] == 1");
        //    Assert.IsTrue(xTestMultidimensionalArray[0, 1] == 2, "Index [0, 1] == 2");
        //    Assert.IsTrue(xTestMultidimensionalArray[1, 0] == 3, "Index [1, 0] == 3");
        //    Assert.IsTrue(xTestMultidimensionalArray[1, 1] == 4, "Index [1, 1] == 4");
        //}

        protected override void Run()
        {
            //TestStep1();
            //TestOurList();
            //Assert.IsTrue(true, "After TestOurList");
            //TestStandardList();
            //Assert.IsTrue(true, "After TestStandardList");
            //TestMultidimensionalArray();
            //Assert.IsTrue(true, "After TestMultidimensionalArray");
            ConstrainedTest.MutateStructTest();
            Assert.IsTrue(true, "After MutateTestStruct");

            TestController.Completed();
        }
    }
}
