#-------------------------------------------------------------------------------
# SPDX-License-Identifier: GPL-2.0-or-later
#-------------------------------------------------------------------------------
# std.nut - Nasal Unit Test for std.nas
# author:  Henning Stahlke
# created: 06/2020
#-------------------------------------------------------------------------------

var setUp = func {
};

var tearDown = func {
};

#-- test std.Hash
var test_hash = func {
    var hash = std.Hash.new({}, "testhash");
    unitTest.assert(isa(hash, std.Hash), "std.Hash.new");
    unitTest.assert(hash.getName() == "testhash" , "std.Hash.getName");

    unitTest.assert(hash.set("foo", 42) == hash, "std.Hash.set");
    unitTest.assert(hash.get("foo") == 42 , "std.Hash.get");
    unitTest.assert(hash.contains("foo"), "std.Hash.contains");

    hash.set("bar", 21);
    unitTest.assert(isvec(hash.getKeys()), "std.Hash.getKeys isvec");
    unitTest.assert(size(hash.getKeys()) == 2, "std.Hash.getKeys size");

    unitTest.assert(hash.clear() == hash, "std.Hash.clear");
    unitTest.assert(!hash.contains("foo"), "std.Hash.contains after clear");
    unitTest.assert(size(hash.getKeys()) == 0, "std.Hash.getKeys after clear");
    
    var cb_hash = {};
    unitTest.assert(hash.addCallback(func(key, val) { cb_hash[key] = val; }) == hash,
        "std.Hash.addCallback");
    hash.set("foo", 21);
    unitTest.assert(cb_hash["foo"] == 21, "std.addCallback worked");
    
    hash.set("funct", func {});
    hash.set("vec", [0,1,2]);
    hash.set("hsh", {a:1, b:2});    

    var tmp = props.Node.new();
    hash.keys2props(tmp);
    unitTest.assert(isa(tmp.getNode("foo"), props.Node), "std.keys2props node ok");
    
    var tmp = props.Node.new();
    hash.hash2props(tmp);
    unitTest.assert(tmp.getNode("foo").getValue() == 21, "std.hash2props ok");    
}
    
#-- test std.String
var test_stoul = func {
    unitTest.assert(std.stoul("123") == 123, "std.stoul 123");
    unitTest.assert(std.stoul("A0", 16) == 160, "std.stoul 0xAF");
}

var test_string = func {
    var x = std.String.new("FlightGear");
    unitTest.assert(isa(x, std.String), "std.String.new");
    unitTest.assert(x.compare("FlightGear"), "std.String.compare");
    
    unitTest.assert(x.starts_with("Fli"), "std.String.starts_with");
    unitTest.assert(!x.starts_with("Gear"), "std.String.starts_with");
    
    unitTest.assert(x.find_first_of("i") == 2, "std.String.find_first_of");
    unitTest.assert(x.find_first_of("i", 3) == -1, "std.String.find_first_of");
    unitTest.assert(x.find_first_not_of("F") == 1, "std.String.find_first_not_of");
    unitTest.assert(x.find_first_not_of("F", 2) == 2, "std.String.find_first_not_of");
    unitTest.assert(x.find_first_not_of("F", 3) == 3, "std.String.find_first_not_of");
}
    
#-- test std.Vector
var test_vector = func {
    var x = std.Vector.new();
    unitTest.assert(isa(x, std.Vector), "std.Vector.new()");
    unitTest.assert(x.size() == 0);

    x = std.Vector.new(["x", "y"]);
    unitTest.assert_equal(x.vector, ["x", "y"], "std.Vector.new(['x', 'y'])");
    unitTest.assert(x.size() == 2, "std.Vector.new size 2");
    x.clear();
    unitTest.assert(isvec(x.vector) and x.size() == 0);

    x = std.Vector.new([], "testvector");
    var cb_vector = [];
    unitTest.assert(x.getName() == "testvector" , "std.Vector.getName");
    unitTest.assert(x.addCallback(func (index, item) {
            if (index >= size(cb_vector)) append(cb_vector, item);
            else cb_vector = cb_vector[0:index]~[item]~subvec(cb_vector, index);
        }) == x, "std.Vector.addCallback");

    # append():
    x.append("a");
    x.append("b");
    x.append("c");
    unitTest.assert_equal(x.vector, ["a", "b", "c"]);
    unitTest.assert_equal(cb_vector, ["a", "b", "c"]);
    unitTest.assert(x.size() == 3);

    # extend():
    x.extend(["d", "e"]);
    unitTest.assert_equal(x.vector, ["a", "b", "c", "d", "e"]);
    unitTest.assert(x.size() == 5);

    # insert():
    x.insert(2, "cc");
    unitTest.assert_equal(x.vector, ["a", "b", "cc", "c", "d", "e"]);
    unitTest.assert(x.size() == 6);

    # pop():
    unitTest.assert(x.pop(3), "c");
    unitTest.assert_equal(x.vector, ["a", "b", "cc", "d", "e"]);
    unitTest.assert(x.size() == 5);

    unitTest.assert(x.pop(), "e");
    unitTest.assert_equal(x.vector, ["a", "b", "cc", "d"]);
    unitTest.assert(x.size() == 4);


    # extend():
    x.clear();
    x.extend(["a", "b", "c", "d"]);
    unitTest.assert_equal(x.vector, ["a", "b", "c", "d"]);
    unitTest.assert(x.size() == 4);

    # index():
    unitTest.assert(x.index("c"), 2);

    # contains():
    unitTest.assert(x.contains("c"));
    unitTest.assert(x.contains("e") == 0);

    # remove():
    x.remove("c");
    unitTest.assert_equal(x.vector, ["a", "b", "d"]);
    unitTest.assert(x.size() == 3);

    # insert():
    x.insert(0, "f");
    unitTest.assert_equal(x.vector, ["f", "a", "b", "d"]);
    unitTest.assert(x.size() == 4);
    x.remove("f");
    unitTest.assert_equal(x.vector, ["a", "b", "d"]);

    x.insert(1, "f");
    unitTest.assert_equal(x.vector, ["a", "f", "b", "d"]);
    unitTest.assert(x.size() == 4);
    x.remove("f");
    unitTest.assert_equal(x.vector, ["a", "b", "d"]);

    x.insert(2, "f");
    unitTest.assert_equal(x.vector, ["a", "b", "f", "d"]);
    x.remove("f");
    unitTest.assert_equal(x.vector, ["a", "b", "d"]);

    x.insert(3, "g");
    unitTest.assert_equal(x.vector, ["a", "b", "d", "g"]);
    x.remove("g");

    x.insert(4, "g");
    unitTest.assert_equal(x.vector, ["a", "b", "d", "g"]);
    x.remove("g");

    x.insert(-1, "h");
    unitTest.assert_equal(x.vector, ["a", "b", "h", "d"]);
    x.remove("h");

    x.insert(-2, "h");
    unitTest.assert_equal(x.vector, ["a", "h", "b", "d"]);
    x.remove("h");

    x.insert(-3, "h");
    unitTest.assert_equal(x.vector, ["h", "a", "b", "d"]);
    x.remove("h");

    x.insert(-4, "h");
    unitTest.assert_equal(x.vector, ["h", "a", "b", "d"]);
    x.remove("h");

    # pop():
    unitTest.assert(x.pop(-1) == "d");
    unitTest.assert_equal(x.vector, ["a", "b"]);
    x.append("d");

    unitTest.assert(x.pop(-2) == "b");
    unitTest.assert_equal(x.vector, ["a", "d"]);
    x.insert(1, "b");

    unitTest.assert(x.pop(-3) == "a");
    unitTest.assert_equal(x.vector, ["b", "d"]);
    x.insert(0, "a");
    unitTest.assert_equal(x.vector, ["a", "b", "d"]);    
}