
::Include(_("test_base.script"));

class wxTest extends script_test_base
{
    function Run()
    {
        test_test();
        test_wxstring();
        test_wxstring_unicode();
        test_wxcolor();
        test_wxarray_string();
        test_wxfilename();
        test_wxpoint();
        test_wxsize();
        test_dialogs();
        print_global_test_result();
    }

    function test_test()
    {
        ::print("======= Test Test environment BEGINN ======= \n");
        clear_test_result();
        ::print(" this is intended to fail: \n");
        test_string("test_string","hallo","nope");
        print_test_result();
        ::print("======= Test Test environment END ======= \n");
    }

    function test_wxstring()
    {
        ::print("======= Test wx String BEGINN ======= \n");
        clear_test_result();

        local string = _T("Hallo");
        if(test_string("tostring",string,"Hallo") == true)
            made_passed("constructor(SQchar)");
        else
            made_failed("constructor(SQchar)","see previous result");


        test_false("IsEmpty",string.IsEmpty());
        test_equal("Length",string.Length(),5);
        test_equal("length",string.length(),5);
        test_equal("len",string.len(),5);
        test_equal("size",string.size(),5);
        test_string("Lower",string.Lower(),"hallo");
        string.LowerCase();
        test_string("LowerCase",string,"hallo");
        test_string("MakeLower",string.MakeLower(),"hallo");
        test_string("Upper",string.Upper(),"HALLO");
        string.UpperCase();
        test_string("UpperCase",string,"HALLO");
        test_string("MakeUpper",string.MakeUpper(),"HALLO");
        string = _T("Hallo");
        test_string("Mid",string.Mid(2,2),"ll");
        test_string("Remove",string.Remove(2,string.len()-2),"Ha");
        string = _T("Hallo");
        test_string("RemoveLast",string.RemoveLast(2),"Hal");
        string = _T("Hallo");
        test_equal("Replace ret",string.Replace(_("ll"),_("xx")),1);
        test_string("Replace value",string,"Haxxo");
        string = _T("Hallo");
        test_string("AfterFirst",string.AfterFirst(_T("l")),"lo");
        string = _T("Hallo");
        //test_string("AfterFirst const",string.AfterFirst('l'),"lo");
        //string = _T("Hallo");
        test_string("AfterLast",string.AfterLast(_T("l")),"o");
        string = _T("Hallo");
        //test_string("AfterLast const",string.AfterLast('l'),"o");
        //string = _T("Hallo");
        test_string("BeforeFirst",string.BeforeFirst(_T("l")),"Ha");
        string = _T("Hallo");
        test_string("BeforeLast",string.BeforeLast(_T("l")),"Hal");
        string = _T("Hallo");
        test_string("Right",string.Right(2),"lo");
        string = _T("Hallo");
        test_true("Matches",string.Matches(_T("Ha*o")));
        string = _T("long_string_to_test_replace");
        //test_string("insert",string.insert(4,_T("_new")),"long_new_string_to_test_replace" );
        //test_string("replace(start, len,string)",string.replace(5,3,_T("old")),"long_old_string_to_test_replace");
        //test_string("replace(start, len,string,start2,len2)",string.replace(5,3,_T("old_new_string"),4,3),"long_new_string_to_test_replace");
        //string = _T("42");
        //local ret_val = string.ToInt(10);
        //if(!ret_val.success)
        //    made_failed("ToInt","it was no success");
        //test_equal("ToInt",ret_val.value,42);
        //string = _T("42.42");
        //ret_val = string.ToDouble();
        //if(!ret_val.success)
        //    made_failed("ToDouble","it was no success");
        //test_equal("ToDouble",ret_val.value,42.42);

        local hasException = false;
        try
        {
            // This is expected to throw an exception.
            local nullstr;
            local res = _T("SomeString") + nullstr;
        }
        catch(e)
        {
            passed("ConcatNull");
            hasException = true;
        }
        if (!hasException)
            failed("ConcatNull");

        print_test_result();
        ::print("======= Test wx String END ======= \n");
    }

    function test_wxstring_unicode()
    {
        clear_test_result();
        ::print("======= Test wx String unicode BEGINN ======= \n");
        ::print("test string: !5Aa ЉЩщӃ ウインカリ\n");
        made_failed("This implementation doesn't support UNICODE","not implemented, as you can see on the wrong test string (it has to show Cyrillic  and ?Japanese? symbols")


 //       local string = _T("!5Aa ЉЩщӃ ウインカリ");
 //       if(test_string("tostring",string,"!5Aa ЉЩщӃ ウインカリ") == true)
 //           made_passed("constructor(SQchar)");
 //       else
 //           made_failed("constructor(SQchar)","see previous result");
 //
 //       local string2 = _T(string);
 //       if(test_string("tostring",string2,"!5Aa ЉЩщӃ ウインカリ") == true)
 //           made_passed("constructor(_T)");
 //       else
 //           made_failed("constructor(_T)","see previous result");
 //
 //       string2 = _T(42);
 //       if(test_string("tostring",string2,"42") == true)
 //           made_passed("constructor(42)");
 //       else
 //           made_failed("constructor(42)","see previous result");
 //
 //       string2 = _T(42.42);
 //       if(test_string("tostring",string2,"42.42") == true)
 //           made_passed("constructor(42.42)");
 //       else
 //           made_failed("constructor(42.42)","see previous result");
 //
 //       test_false("IsEmpty",string.IsEmpty());
 //       test_equal("Length",string.Length(),15);
 //       test_equal("length",string.length(),15);
 //       test_equal("len",string.len(),15);
 //       test_equal("size",string.size(),15);
 //       /*test_string("Lower",string.Lower(),"hallo");
 //       string.LowerCase();
 //       test_string("LowerCase",string,"hallo");
 //       test_string("MakeLower",string.MakeLower(),"hallo");
 //       test_string("Upper",string.Upper(),"HALLO");
 //       string.UpperCase();
 //       test_string("UpperCase",string,"HALLO");
 //       test_string("MakeUpper",string.MakeUpper(),"HALLO");
 //       string = _T("Hallo");
 //       test_string("Mid",string.Mid(2,2),"ll");
 //       test_string("Remove",string.Remove(2,string.len()-2),"Ha");*/
 //       string = _T("!5Aa ЉЩщӃ ウインカリ");
 //       test_string("RemoveLast",string.RemoveLast(2),"!5Aa ЉЩщӃ ウイン");
 //       string = _T("!5Aa ЉЩщӃ ウインカリ");
 //       test_equal("Replace ret",string.Replace(_("Љ"),_("ウ")),1);
 //       test_string("Replace value",string,"!5Aa ウЩщӃ ウインカリ");
 //       string = _T("!5Aa ЉЩщӃ ウインカリ");
 //       test_string("AfterFirst",string.AfterFirst("ウ"),"インカリ");
 //       string = _T("!5Aa ЉЩщӃ ウインカリ");
 //       test_string("AfterFirst const",string.AfterFirst('5'),"Aa ЉЩщӃ ウインカリ");
 //       string = _T("!5Aa ЉЩщӃ ウインカリ");
 //       test_string("AfterLast",string.AfterLast("щ"),"Ӄ ウインカリ");
 //
 //
        print_test_result();
        ::print("======= Test wx String unicode END ======= \n");
    }

    function test_wxcolor()
    {
        ::print("======= Test wx Color BEGINN ======= \n");
        clear_test_result();
        local color = wxColour();
        color.Set(52,53,54,255);
        test_string("Set",color,"[r=52, g=53, b=54]");
        test_string("tostring",color,"[r=52, g=53, b=54]");
        test_equal("Red",color.Red(),52);
        test_equal("Green",color.Green(),53);
        test_equal("Blue",color.Blue(),54);
        test_true("IsOK",color.IsOk());

        print_test_result();
        ::print("======= Test wx Color END  ======= \n");
    }

    function test_wxarray_string()
    {
        ::print("======= Test wxArrayString BEGINN ======= \n");
        clear_test_result();
        local array;
        try
        {
            array = wxArrayString();
        } catch  (err)
        {
            made_failed("constructor"," ");
            return;
        }
        made_passed("constructor");


        array.Add(_T("String1"),1);
        array.Add(_T("String2"),2);
        test_equal("Add",array.Add(_T("String3"),1),3);
        test_equal("GetCount",array.GetCount(),4);
        test_equal("Index(\"String1\")", array.Index(_T("String1")),0);
        test_equal("Index(\"String10\")", array.Index(_T("String10")),-1);
        test_equal("Index(\"string1\",true,false)", array.Index(_T("string10"),true,false),-1);
        test_equal("Index(\"string1\",false,false)", array.Index(_T("string1"),false),0);
        test_equal("Index(\"string2\",false,false)", array.Index(_T("string2"),false,false),1);
        test_equal("Index(\"string2\",false,true)", array.Index(_T("string2"),false,true),2);
        test_string("Item", array.Item(2),_T("String2"));

        // Test if modifying the result of Item doesn't change the value in the array.
        local itemValue = array.Item(2);
        itemValue = _T("String2 modified");
        test_string("Item after modify", array.Item(2),_T("String2"));

        // Test SetItem.
        array.SetItem(2, _T("String2 modified"));
        test_string("SetItem", array.Item(2),_T("String2 modified"));

        array.Clear();
        test_equal("Clear",array.GetCount(),0);

        print_test_result();
        ::print("======= Test wxArrayString END  ======= \n");
    }

    function test_wxfilename()
    {
               ::print("======= Test wxFileName BEGINN ======= \n");
        clear_test_result();
        local filename;
        try
        {
            filename = wxFileName();
        } catch  (err)
        {
            made_failed("constructor"," ");
            return;
        }
        made_passed("constructor");

        local path;
        if(::PLATFORM == ::PLATFORM_MSW )
        {
            path = _T("\\share\\codeblocks\\");
        }
        else if(::PLATFORM == ::PLATFORM_GTK)
        {
            path = _T("share/codeblocks/");
        }
        else
        {
            made_failed("Assign","Your operating system is not supported in this test script. Please add a test case. Thank you.");
            return;
        }
        ::print("Use path: " + path + "\n");
        filename.Assign(path,::wxPATH_NATIVE);
        test_string("tostring",filename,path);
        test_string("Assign",filename,path);
        test_equal("GetDirCount",filename.GetDirCount(),2);
        test_equal("GetDirs",filename.GetDirs().GetCount(),2);

        filename.Clear();
        test_string("Clear",filename,"");
        filename.AssignCwd(_T(" "));
        ::print("Test: AssignCwd = " + filename + " \n");
        made_passed("AssignCwd ????");
        filename.Clear();
        filename.AssignHomeDir();
        ::print("Test: AssignHomeDir = " + filename +" \n");
        made_passed("AssignHomeDir ????");
        filename.Clear();
        filename.Assign(path + _T("tips.txt"),::wxPATH_NATIVE);
        test_string("GetExt",filename.GetExt(),"txt");
        test_string("GetFullName",filename.GetFullName(),"tips.txt");
        test_string("GetFullPath",filename.GetFullPath(::wxPATH_NATIVE), path + "tips.txt");
        ::print("Test: GetLongPath = " + filename.GetLongPath() +" \n");
        made_passed("GetLongPath ????");
        test_string("GetName",filename.GetName(),"tips");
        ::print("Test: GetPath = " + filename.GetPath(0,::wxPATH_NATIVE) + " \n");
        made_passed("GetPath ????");
        ::print("Test: GetShortPath = " + filename.GetShortPath() + " \n");
        made_passed("GetShortPath ????");
        ::print("Test: GetVolume = " + filename.GetVolume() + " \n");
        made_passed("GetVolume ????");
        test_true("HasExt",filename.HasExt());
        test_true("HasName",filename.HasName());
        if(::PLATFORM != ::PLATFORM_MSW)
            test_false("HasVolume",filename.HasVolume());
        else
            test_true("HasVolume",filename.HasVolume());

        test_false("IsAbsolute",filename.IsAbsolute(::wxPATH_NATIVE));
        test_true("IsOk",filename.IsOk());
        test_true("IsRelative",filename.IsRelative(::wxPATH_NATIVE));
        test_false("IsDir",filename.IsDir());

        print_test_result();
        ::print("======= Test wxFileName END  ======= \n");
    }

    function test_wxpoint()
    {
        ::print("======= Test wxPoint BEGINN ======= \n");
        clear_test_result();

        local point1 = wxPoint();
        local point2 = wxPoint();
        local point3 = wxPoint();
        point1.x = 10;
        point1.y = 10;
        point2.x = 10;
        point2.y = 10;
        point3.x = 10;
        point3.y = 5;
        made_failed("compare doesn't seem to work","error: \"comparsion between 'instance' and 'instance'\" ")
        //test_false("compare",point1 > point2);
        //test_true("compare",point1 > point3);
        //test_true("Cmp",point1._cmp(point2));
        //test_false("Cmp",point1._cmp(point3));
        test_string("_tostring",point1,"[10,10]");

        print_test_result();
        ::print("======= Test wxPoint END  ======= \n");
    }

    function test_wxsize()
    {
        ::print("======= Test wxSize BEGINN ======= \n");
        clear_test_result();

        local point1 = wxSize();
        local point2 = wxSize();
        local point3 = wxSize();
        point1.Set(10,10);
        point2.Set(10,10);
        point3.Set(10,5);

        test_string("_tostring",point1,"[10,10]");
        //test_true("Cmp",point1.Cmp(point2));
        //test_false("Cmp",point1.Cmp(point3));
        test_equal("GetWidth",point3.GetWidth(),10);
        test_equal("GetHeight",point3.GetHeight(),5);
        point3.SetWidth(23);
        point3.SetHeight(66);
        test_equal("SetWidth",point3.GetWidth(),23);
        test_equal("SetHeight",point3.GetHeight(),66);


        print_test_result();
        ::print("======= Test wxSize END  ======= \n");
    }

    function test_dialogs()
    {

    }
};
