/*
 * Copyright 2012 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "SkTSet.h"
#include "Test.h"

// Tests the SkTSet<T> class template.
// Functions that just call SkTDArray are not tested.

static void TestTSet_basic(skiatest::Reporter* reporter) {
    SkTSet<int> set0;
    REPORTER_ASSERT(reporter,  set0.isEmpty());
    REPORTER_ASSERT(reporter, !set0.contains(-1));
    REPORTER_ASSERT(reporter, !set0.contains(0));
    REPORTER_ASSERT(reporter, !set0.contains(1));
    REPORTER_ASSERT(reporter,  set0.count() == 0);

    REPORTER_ASSERT(reporter,  set0.add(0));
    REPORTER_ASSERT(reporter, !set0.isEmpty());
    REPORTER_ASSERT(reporter, !set0.contains(-1));
    REPORTER_ASSERT(reporter,  set0.contains(0));
    REPORTER_ASSERT(reporter, !set0.contains(1));
    REPORTER_ASSERT(reporter,  set0.count() == 1);
    REPORTER_ASSERT(reporter, !set0.add(0));
    REPORTER_ASSERT(reporter,  set0.count() == 1);

#ifdef SK_DEBUG
    set0.validate();
#endif
}

#define COUNT 1732
#define PRIME1 10007
#define PRIME2 1733

// Generates a series of positive unique pseudo-random numbers.
static int f(int i) {
    return (long(i) * PRIME1) % PRIME2;
}

// Will expose contains() too.
static void TestTSet_advanced(skiatest::Reporter* reporter) {
    SkTSet<int> set0;

    for (int i = 0; i < COUNT; i++) {
        REPORTER_ASSERT(reporter, !set0.contains(f(i)));
        if (i > 0) {
            REPORTER_ASSERT(reporter,  set0.contains(f(0)));
            REPORTER_ASSERT(reporter,  set0.contains(f(i / 2)));
            REPORTER_ASSERT(reporter,  set0.contains(f(i - 1)));
        }
        REPORTER_ASSERT(reporter, !set0.contains(f(i)));
        REPORTER_ASSERT(reporter,  set0.count() == i);
        REPORTER_ASSERT(reporter,  set0.add(f(i)));
        REPORTER_ASSERT(reporter,  set0.contains(f(i)));
        REPORTER_ASSERT(reporter,  set0.count() == i + 1);
        REPORTER_ASSERT(reporter, !set0.add(f(i)));
    }

    // Test deterministic output
    for (int i = 0; i < COUNT; i++) {
        REPORTER_ASSERT(reporter, set0[i] == f(i));
    }

    // Test copy constructor too.
    SkTSet<int> set1 = set0;

    REPORTER_ASSERT(reporter, set0.count() == set1.count());
    REPORTER_ASSERT(reporter, !set1.contains(-1000));

    for (int i = 0; i < COUNT; i++) {
        REPORTER_ASSERT(reporter, set1.contains(f(i)));
        REPORTER_ASSERT(reporter, set1[i] == f(i));
    }

    // Test operator= too.
    SkTSet<int> set2;
    set2 = set0;

    REPORTER_ASSERT(reporter, set0.count() == set2.count());
    REPORTER_ASSERT(reporter, !set2.contains(-1000));

    for (int i = 0; i < COUNT; i++) {
        REPORTER_ASSERT(reporter, set2.contains(f(i)));
        REPORTER_ASSERT(reporter, set2[i] == f(i));
    }

#ifdef SK_DEBUG
    set0.validate();
    set1.validate();
    set2.validate();
#endif
}

static void TestTSet_merge(skiatest::Reporter* reporter) {
    SkTSet<int> set;
    SkTSet<int> setOdd;

    for (int i = 0; i < COUNT; i++) {
        REPORTER_ASSERT(reporter, set.add(2 * i));
        REPORTER_ASSERT(reporter, setOdd.add(2 * i + 1));
    }
    // mergeInto returns the number of duplicates. Expected 0.
    REPORTER_ASSERT(reporter, set.mergeInto(setOdd) == 0);
    REPORTER_ASSERT(reporter, set.count() == 2 * COUNT);

    // mergeInto should now find all new numbers duplicate.
    REPORTER_ASSERT(reporter, set.mergeInto(setOdd) == setOdd.count());
    REPORTER_ASSERT(reporter, set.count() == 2 * COUNT);

    for (int i = 0; i < 2 * COUNT; i++) {
        REPORTER_ASSERT(reporter, set.contains(i));
    }

    // check deterministic output
    for (int i = 0; i < COUNT; i++) {
        REPORTER_ASSERT(reporter, set[i] == 2 * i);
        REPORTER_ASSERT(reporter, set[COUNT + i] == 2 * i + 1);
    }

#ifdef SK_DEBUG
    set.validate();
    setOdd.validate();
#endif
}

DEF_TEST(TSet, reporter) {
    TestTSet_basic(reporter);
    TestTSet_advanced(reporter);
    TestTSet_merge(reporter);
}
