// test_class_SSArray_default_ctor
// Test suite for class template SSArray, default ctor
// Pre: None.
// Post:
//     Pass/fail status of tests have been registered with t.
//     Appropriate have been messages printed to cout.
// Does not throw (No-Throw Guarantee)
void test_class_SSArray_default_ctor(Tester & t)
{
    std::cout << "Test Suite: class template SSArray - default ctor"
              << std::endl;

    const SSArray<int> tai1;
    t.test(tai1.size() == 10, "default ctor, size");
}
// test_class_SSArray_size_and_ctor_from_size
// Test suite for class template SSArray, function size and ctor from size
// Pre: None.
// Post:
//     Pass/fail status of tests have been registered with t.
//     Appropriate messages have been printed to cout.
// Does not throw (No-Throw Guarantee)
void test_class_SSArray_size_and_ctor_from_size(Tester & t)
{
    std::cout << "Test Suite: class template SSArray - "
              << "function size, ctor from size"
              << std::endl;

    bool correctType;  // result of type checking

    const SSArray<int> tai1(1);

    correctType = TypeCheck<SSArray<int>::size_type>::check(tai1.size());
    t.test(correctType, "size, return type");

    t.test(tai1.size() == 1, "ctor from size (const) #1, check size");

    const SSArray<int> tai2(10);
    t.test(tai2.size() == 10, "ctor from size (const) #2, check size");

    const SSArray<double> tad(100);
    t.test(tad.size() == 100, "ctor from size (const) #3, check size");

    SSArray<int> tai3(20);
    t.test(tai3.size() == 20, "ctor from size (non-const), check size");

    const SSArray<int> tai4(0);
    t.test(tai4.size() == 0, "ctor from size (size 0), check size");
}
// test_class_SSArray_size_and_ctor_from_size
// Test suite for class SSArray, function size and ctor from size
// Pre: None.
// Post:
//     Pass/fail status of tests have been registered with t.
//     Appropriate have been messages printed to cout.
void test_class_SSArray_size_and_ctor_from_size(Tester & t)
{
    std::cout << "Test Suite: class SSArray - function size, ctor from size" << std::endl;

    const SSArray<int> ssai(10);
    t.test(ssai.size() == 10, "size, ctor from size (const) #1");

    const SSArray<double> ssad(100);
    t.test(ssad.size() == 100, "size, ctor from size (const) #2)");

    SSArray<int> ssai2(20);
    t.test(ssai2.size() == 20, "size, ctor from size (non-const)");
}
// test_class_SSArray_begin_end
// Test suite for class template SSArray, functions begin & end
// Pre: None.
// Post:
//     Pass/fail status of tests have been registered with t.
//     Appropriate messages have been printed to cout.
// Does not throw (No-Throw Guarantee)
void test_class_SSArray_begin_end(Tester & t)
{
    std::cout << "Test Suite: class template SSArray - "
              << "functions begin & end"
              << std::endl;

    bool correctType;  // result of type checking

    const int theSize = 10;
    bool noErrors;      // True if no errors encountered
    int i;              // Counter
    int * iter;         // iterator
    const int * citer;  // const_iterator

    SSArray<int> tai(theSize);
    for (iter = tai.begin(), i = 0; iter != tai.end(); ++iter, ++i)
        *iter = 15 - i * i;

    // Non-const test
    SSArray<double> tad1;

    correctType =
      TypeCheck<SSArray<double>::value_type *>::check(tad1.begin());
    t.test(correctType, "begin (non-const), return type");
    
    correctType =
      TypeCheck<SSArray<double>::value_type *>::check(tad1.end());
    t.test(correctType, "end (non-const), return type");

    t.test(tai.begin() != tai.end(), "begin/end - inequality (non-const)");
    t.test (tai.end() - tai.begin() == theSize,
      "begin/end - check difference (non-const)");
    noErrors = true;
    for (iter = tai.begin(), i = 0; iter != tai.end(); ++iter, ++i)
    {
        if (*iter != 15 - i * i)
            noErrors = false;
    }
    t.test(noErrors, "begin/end - check values (non-const)");

    // Make const version, no copy
    const SSArray<int> & taiRef = tai;

    // Const test
    const SSArray<double> tad2;

    correctType =
      TypeCheck<const SSArray<double>::value_type *>::check(tad2.begin());
    t.test(correctType, "begin (const), return type");
    
    correctType =
      TypeCheck<const SSArray<double>::value_type *>::check(tad2.end());
    t.test(correctType, "end (const), return type");
    
    t.test(taiRef.end() - taiRef.begin() == theSize,
      "begin/end - check difference (const)");
    noErrors = true;
    for (citer = taiRef.begin(), i = 0;
         citer != taiRef.end();
         ++citer, ++i)
    {
        if (*citer != 15 - i * i)
            noErrors = false;
    }
    t.test(noErrors, "begin/end - check values (const)");
}