#!/usr/bin/ruby

#
## Struct 1
#

struct Person {
    name,
    age,
}

var man = Person(name: "John Smith", age: 30);

assert_eq(man.name, "John Smith");
assert_eq(man.age, 30);

man.age += 1;
assert_eq(man.age, 31);

var woman = Person("Chris Miller", 24);

assert_eq(woman.name, "Chris Miller");
assert_eq(woman.age, 24);

#
## Struct 2
#

struct Job {
    String title,
    Number salary = 1000,       # default salary
}

var job1 = Job(title: "Programmer", salary: 3000);
var job2 = Job("Writer", 2400);
var job3 = Job("Worker");

assert_eq(job1.salary, 3000);
assert_eq(job2.salary, 2400);
assert_eq(job3.salary, 1000);

job3.salary = 800;
assert_eq(job3.salary, 800);
assert_eq(job2.salary, 2400);

assert_eq(woman.age, 24);
assert_eq(man.age, 31);

do {
    var error = false
    try {
        Job(42, "foo")
    }
    catch {
        error = true
    }
    assert(error)
}

#
## Lexical structures
#

func bar {
    struct Foo {
        String name { |s| s != 'foo' },
        Number age  { |n| n != 42 },
    }

    var obj = Foo("bar", 21)

    assert_eq(obj.name, "bar")
    assert_eq(obj.age, 21)
}


func foo {
    struct Foo {
        String name,
        Number age,
    }

    var obj = Foo("foo", 42)

    assert_eq(obj.name, "foo")
    assert_eq(obj.age, 42)
}

struct Foo {
    Number x,
    Number y,
}

foo()
bar()

var obj = Foo(5, 6)

assert_eq(obj.x, 5)
assert_eq(obj.y, 6)

say "** Test passed!";