// Test reshape()

proc main()
{
    var a;

    /* Variable array */
    a = new Array(3);

    a[0] = 0; a[1] = 1; a[2] = 2;
    try { a[3] = 3; } catch(e) { "No a[3] as expected\n"; }

    a = a.reshape(4);
    "a = {", a[0], ", ", a[1], ", ", a[2], ", ", a[3], "}\n";
    a[3] = 3;
    "a[3] = ", a[3], "\n";

    a = a.reshape(2);
    try { a[2] = 2; } catch(e) { "No a[2] as expected\n"; }
    "a = {", a[0], ", ", a[1], "}\n";

    /* String */
    a = @ "012";
    try { a[3] = '3'; } catch(e) { "No a[3] as expected\n"; }

    a = a.reshape(4);
    "a = {", a[0], ", ", a[1], ", ", a[2], ", ", Int(a[3]) , "}\n";

    a[3] = '3';
    "a[3] = ", a[3], "\n";

    a = a.reshape(2);
    try { a[2] = '2'; } catch(e) { "No a[2] as expected\n"; }
    "a = \"", a, "\"\n";

    /* Wide String */
    a = @ L"012";
    try { a[3] = '3'; } catch(e) { "No a[3] as expected\n"; }

    a = a.reshape(4);
    "a = {", a[0], ", ", a[1], ", ", a[2], ", ", Int(a[3]), "}\n";

    a[3] = '3';
    "a[3] = ", a[3], "\n";

    a = a.reshape(2);
    try { a[2] = '2'; } catch(e) { "No a[2] as expected\n"; }
    "a = \"", a, "\"\n";

    /* Packint */
    a = new PackInt(3);

    a[0] = 0; a[1] = 1; a[2] = 2;
    try { a[3] = 3; } catch(e) { "No a[3] as expected\n"; }

    a = a.reshape(4);
    "a = {", a[0], ", ", a[1], ", ", a[2], ", ", a[3], "}\n";
    a[3] = 3;
    "a[3] = ", a[3], "\n";

    a = a.reshape(2);
    try { a[2] = 2; } catch(e) { "No a[2] as expected\n"; }
    "a = {", a[0], ", ", a[1], "}\n";

    /* Packfloat */
    a = new PackFloat(3);

    a[0] = 0; a[1] = 1; a[2] = 2;
    try { a[3] = 3; } catch(e) { "No a[3] as expected\n"; }

    a = a.reshape(4);
    "a = {", a[0], ", ", a[1], ", ", a[2], ", ", a[3], "}\n";
    a[3] = 3;
    "a[3] = ", a[3], "\n";

    a = a.reshape(2);
    try { a[2] = 2; } catch(e) { "No a[2] as expected\n"; }
    "a = {", a[0], ", ", a[1], "}\n";

    /* Dictionary */
    a = new Dict(3);

    a[0] = 0; a[1] = 1; a[2] = 2;
    try { a[3] = 3; } catch(e) { "No a[3] as expected\n"; }

    a = a.reshape(4);
    "a = {", a[0], ", ", a[1], ", ", a[2], ", ", a[3], "}\n";
    a[3] = 3;
    "a[3] = ", a[3], "\n";

    try {
        a = a.reshape(2);
    }
    catch(e) {
        "Can't shrink dict, as expected\n";
    }
}