module tests.fake_units_tests;

debug import std.stdio;

@("Let there be units")
unittest
{
    import quantities;
    import std.exception : assertThrown;

    // Let there be units
    auto apple = unit!int("Apple");
    auto cookie = unit!int("Cookie");
    auto movie = unit!int("Movie");

    // Let there be prefixes
    alias few = prefix!2;
    alias many = prefix!100;

    auto tolerated = few(cookie) / movie;
    auto toxic = 50 * tolerated;

    // 100 cookies is really too much for one movie
    assert(toxic.value(cookie / movie) == 100);

    // How many cookies are tolerated if I watch 10 movies a week
    assert((tolerated * 10 * movie).value(cookie) == 20);

    // Don't mix cookies with apples
    assertThrown!DimensionException(cookie + apple);

    // Let there be a parser
    auto symbols = SymbolList!int().addUnit("🍎", apple).addUnit("🍪",
            cookie).addUnit("🎬", movie).addPrefix("🙂", 2).addPrefix("😃", 100);
    auto parser = Parser!int(symbols);

    // Use parsed quantities
    assert(tolerated == parser.parse("🙂🍪/🎬"));
    assert(toxic == parser.parse("😃🍪/🎬"));
}