Content-Aware-Image-Resizer / tests / Matrix_tests.cpp
Matrix_tests.cpp
Raw

#include "Matrix.h"
#include "Matrix_test_helpers.h"
#include "unit_test_framework.h"

using namespace std;

TEST(test_fill_basic) {
  Matrix *mat = new Matrix; // create a Matrix in dynamic memory

  const int width = 3;
  const int height = 5;
  const int value = 42;
  Matrix_init(mat, width, height);
  Matrix_fill(mat, value);

  for(int r = 0; r < height; ++r){
    for(int c = 0; c < width; ++c){
      ASSERT_EQUAL(*Matrix_at(mat, r, c), value);
    }
  }

  delete mat; // delete the Matrix
}

TEST(test_fill_edge) {
    Matrix *mat = new Matrix;

    const int width = 1;
    const int height = 1;
    const int value = 0;
    Matrix_init(mat, width, height);
    Matrix_fill(mat, value);

    for(int r = 0; r < height; ++r){
        for(int c = 0; c < width; ++c){
            ASSERT_EQUAL(*Matrix_at(mat, r, c), value);
        }
    }

    delete mat;
}

TEST(test_init1) {
    Matrix *mat = new Matrix;

    Matrix_init(mat, 1, 1);
    ASSERT_EQUAL(Matrix_width(mat), 1);
    ASSERT_EQUAL(Matrix_height(mat), 1);
    
    delete mat;
}

TEST(test_init2) {
    Matrix *mat = new Matrix;

    Matrix_init(mat, 3, 5);
    ASSERT_EQUAL(Matrix_width(mat), 3);
    ASSERT_EQUAL(Matrix_height(mat), 5);
    
    delete mat;
}

TEST(test_print_basic) {
    Matrix *mat = new Matrix;
    Matrix_init(mat, 3, 3);
    Matrix_fill(mat, 1);
    
    *Matrix_at(mat, 0, 0) = 2;
    ostringstream expected;
    expected << "3 3\n"
            << "2 1 1 \n"
            << "1 1 1 \n"
            << "1 1 1 \n";
    
    ostringstream actual;
    Matrix_print(mat, actual);
    ASSERT_EQUAL(expected.str(), actual.str());

    delete mat;
}

TEST(test_print_edge1) {
    Matrix *mat = new Matrix;
    Matrix_init(mat, 1, 1);

    *Matrix_at(mat, 0, 0) = 42;
    ostringstream expected;
    expected << "1 1\n"
           << "42 \n";
    ostringstream actual;
    Matrix_print(mat, actual);
    ASSERT_EQUAL(expected.str(), actual.str());

    delete mat;
}

TEST(test_print_edge2) {
    Matrix *mat = new Matrix;
    Matrix_init(mat, 2, 3);
    Matrix_fill(mat, 1);
    
    *Matrix_at(mat, 0, 0) = 2;
    ostringstream expected;
    expected << "2 3\n"
            << "2 1 \n"
            << "1 1 \n"
            << "1 1 \n";
    
    ostringstream actual;
    Matrix_print(mat, actual);
    ASSERT_EQUAL(expected.str(), actual.str());

    delete mat;
}

TEST(test_width_basic) {
    Matrix *mat = new Matrix;
    
    Matrix_init(mat, 3, 5);
    
    ASSERT_EQUAL(Matrix_width(mat), 3);
    
    delete mat;
}

TEST(test_height_basic) {
    Matrix *mat = new Matrix;
    
    Matrix_init(mat, 3, 5);
    
    ASSERT_EQUAL(Matrix_height(mat), 5);
    
    delete mat;
}

TEST(test_row_basic) {
    Matrix *mat = new Matrix;
    
    Matrix_init(mat, 5, 3);
    int* ptr = Matrix_at(mat, 2, 2);
    
    ASSERT_EQUAL(Matrix_row(mat, ptr), 2);
    
    delete mat;
}

TEST(test_row_edge) {
    Matrix *mat = new Matrix;
    
    Matrix_init(mat, 1, 1);
    int* ptr = Matrix_at(mat, 0, 0);
    
    ASSERT_EQUAL(Matrix_row(mat, ptr), 0);
    
    delete mat;
}

TEST(test_column_basic) {
    Matrix *mat = new Matrix;
    
    Matrix_init(mat, 5, 3);
    int* ptr = Matrix_at(mat, 2, 4);
    
    ASSERT_EQUAL(Matrix_column(mat, ptr), 4);
    
    delete mat;
}

TEST(test_column_edge) {
    Matrix *mat = new Matrix;
    
    Matrix_init(mat, 1, 1);
    int* ptr = Matrix_at(mat, 0, 0);
    
    ASSERT_EQUAL(Matrix_column(mat, ptr), 0);
    
    delete mat;
}

TEST(test_fill_border_basic) {
    Matrix *mat = new Matrix;
    
    const int width = 3;
    const int height = 5;
    const int value = 42;
    Matrix_init(mat, 3, 5);
    Matrix_fill_border(mat, value);

    for (int r = 0; r < height; ++r){
      for (int c = 0; c < width; ++c){
          if (r == 0 || r == (Matrix_height(mat) - 1) || c == 0 || c == (Matrix_width(mat) - 1))    {
              ASSERT_EQUAL(*Matrix_at(mat, r, c), value);
          }
      }
    }
    
    delete mat;
}

TEST(test_fill_border_edge1) {
    Matrix *mat1 = new Matrix;
    Matrix *mat2 = new Matrix;
    
    const int width = 2;
    const int height = 2;
    const int value = 42;
    Matrix_init(mat1, width, height);
    Matrix_fill_border(mat1, value);

    Matrix_init(mat2, width, height);
    Matrix_fill(mat2, value);
    
    ASSERT_TRUE(Matrix_equal(mat1, mat2));
    
    delete mat1;
    delete mat2;
}

TEST(test_fill_border_edge2) {
    Matrix *mat1 = new Matrix;
    Matrix *mat2 = new Matrix;
    
    const int width = 1;
    const int height = 1;
    const int value = 42;
    Matrix_init(mat1, width, height);
    Matrix_fill_border(mat1, value);

    Matrix_init(mat2, width, height);
    *Matrix_at(mat2, 0, 0) = value;
    
    ASSERT_TRUE(Matrix_equal(mat1, mat2));
    
    delete mat1;
    delete mat2;
}

TEST(test_max_basic) {
    Matrix *mat = new Matrix;
    
    const int value = 1;
    Matrix_init(mat, 5, 3);
    Matrix_fill(mat, value);
    *Matrix_at(mat, 2, 4) = 2;
    
    ASSERT_EQUAL(Matrix_max(mat), 2);
    
    delete mat;
}

TEST(test_max_edge1) {
    Matrix *mat = new Matrix;
    
    const int value = 1;
    Matrix_init(mat, 5, 3);
    Matrix_fill(mat, value);
    *Matrix_at(mat, 0, 4) = 2;
    *Matrix_at(mat, 1, 3) = 2;
    *Matrix_at(mat, 2, 2) = 2;
    
    ASSERT_EQUAL(Matrix_max(mat), 2);
    
    delete mat;
}

TEST(test_max_edge2) {
    Matrix *mat = new Matrix;
    
    const int value = 1;
    Matrix_init(mat, 1, 1);
    *Matrix_at(mat, 0, 0) = value;
    
    ASSERT_EQUAL(Matrix_max(mat), 1);
    
    delete mat;
}

TEST(test_max_edge3) {
    Matrix *mat = new Matrix;
    
    const int value = -1;
    Matrix_init(mat, 3, 3);
    Matrix_fill(mat, -2);
    *Matrix_at(mat, 0, 0) = value;
    
    ASSERT_EQUAL(Matrix_max(mat), -1);
    
    delete mat;
}


TEST(test_column_of_min_basic) {
    Matrix *mat = new Matrix;
    
    const int value = 5;
    Matrix_init(mat, 3, 5);
    Matrix_fill(mat, value);
    *Matrix_at(mat, 3, 1) = 3;

    ASSERT_EQUAL(Matrix_column_of_min_value_in_row(mat, 3, 0, 2), 1);
    
    delete mat;
}

TEST(test_column_of_min_edge1) {
    Matrix *mat = new Matrix;
    
    const int value = 5;
    Matrix_init(mat, 3, 5);
    Matrix_fill(mat, value);
    *Matrix_at(mat, 3, 1) = 3;
    *Matrix_at(mat, 3, 2) = 3;

    ASSERT_EQUAL(Matrix_column_of_min_value_in_row(mat, 3, 0, 2), 1);
    
    delete mat;
}

TEST(test_column_of_min_edge2) {
    Matrix *mat = new Matrix;

    Matrix_init(mat, 1, 1);
    *Matrix_at(mat, 0, 0) = 3;

    ASSERT_EQUAL(Matrix_column_of_min_value_in_row(mat, 0, 0, 1), 0);
    
    delete mat;
}

TEST(test_min_value_basic) {
    Matrix *mat = new Matrix;
    
    const int value = 5;
    Matrix_init(mat, 3, 5);
    Matrix_fill(mat, value);
    *Matrix_at(mat, 3, 1) = 3;

    ASSERT_EQUAL(Matrix_min_value_in_row(mat, 3, 0, 2), 3);
    
    delete mat;
}

TEST(test_min_value_edge1) {
    Matrix *mat = new Matrix;
    
    const int value = 5;
    Matrix_init(mat, 3, 5);
    Matrix_fill(mat, value);
    *Matrix_at(mat, 3, 1) = 3;
    *Matrix_at(mat, 3, 2) = 3;

    ASSERT_EQUAL(Matrix_min_value_in_row(mat, 3, 0, 2), 3);
    
    delete mat;
}

TEST(test_min_value_edge2) {
    Matrix *mat = new Matrix;
    
    Matrix_init(mat, 1, 1);
    *Matrix_at(mat, 0, 0) = 3;

    ASSERT_EQUAL(Matrix_min_value_in_row(mat, 0, 0, 1), 3);
    
    delete mat;
}

TEST(test_matrix_at) {
    Matrix *mat = new Matrix;
    
    Matrix_init(mat, 1, 1);
    *Matrix_at(mat, 0, 0) = 3;

    ASSERT_EQUAL(*Matrix_at(mat, 0, 0), 3);
    
    delete mat;
}

TEST(test_matrix_at_const) {
    Matrix *mat = new Matrix;
    
    Matrix_init(mat, 1, 1);
    *Matrix_at(mat, 0, 0) = 3;

    ASSERT_EQUAL(*Matrix_at(mat, 0, 0), 3);
    
    delete mat;
}

TEST_MAIN() // Do NOT put a semicolon here