File: timage2d.cpp

package info (click to toggle)
aoflagger 3.4.0-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 8,960 kB
  • sloc: cpp: 83,076; python: 10,187; sh: 260; makefile: 178
file content (118 lines) | stat: -rw-r--r-- 3,535 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include "../../structures/image2d.h"

#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_SUITE(image2d, *boost::unit_test::label("structures"))

static void AssertAll(const Image2D& image, float value) {
  for (size_t y = 0; y != image.Height(); ++y) {
    for (size_t x = 0; x != image.Width(); ++x) {
      BOOST_CHECK_EQUAL(image.Value(x, y), value);
      BOOST_CHECK_EQUAL(image.ValuePtr(0, y)[x], value);
    }
  }
}

BOOST_AUTO_TEST_CASE(construction) {
  Image2D image(Image2D::MakeSetImage(10, 10, 1.0));
  AssertAll(image, 1.0);

  Image2D copy(image);
  AssertAll(copy, 1.0);

  Image2D moved(std::move(copy));
  AssertAll(moved, 1.0);

  Image2D unset(Image2D::MakeUnsetImage(5, 5));
  unset.SetValue(1, 2, 3.0);
  BOOST_CHECK_EQUAL(unset.Value(1, 2), 3.0);
}

BOOST_AUTO_TEST_CASE(construct_from_initializer_list) {
  const Image2D empty(0, 0, {});
  BOOST_CHECK_EQUAL(empty.Width(), 0);
  BOOST_CHECK_EQUAL(empty.Height(), 0);

  constexpr size_t kWidth = 2;
  constexpr size_t kHeight = 2;
  const Image2D from_init_list(kWidth, kHeight, {1.0, 2.0, 3.0, 4.0, 5.0, 6.0});
  BOOST_CHECK_EQUAL(from_init_list.Width(), kWidth);
  BOOST_CHECK_GE(from_init_list.Stride(), kWidth);
  BOOST_CHECK_EQUAL(from_init_list.Height(), kHeight);
  for (size_t i = 0; i != kWidth * kHeight; ++i) {
    BOOST_CHECK_EQUAL(from_init_list.Value(i % kWidth, i / kWidth), i + 1);
  }
}

BOOST_AUTO_TEST_CASE(assignment) {
  Image2D image1 = Image2D::MakeSetImage(10, 10, 1.0);
  AssertAll(image1, 1.0);

  Image2D image2 = Image2D::MakeSetImage(10, 10, 2.0);
  AssertAll(image2, 2.0);

  image1 = image2;
  AssertAll(image1, 2.0);
  AssertAll(image2, 2.0);

  Image2D image3 = Image2D::MakeSetImage(10, 10, 3.0);
  AssertAll(image3, 3.0);

  image1 = std::move(image3);
  AssertAll(image1, 3.0);

  Image2D unset(Image2D::MakeUnsetImage(5, 5));
  unset = std::move(image3);
  AssertAll(image1, 3.0);
}

BOOST_AUTO_TEST_CASE(operator_equals) {
  Image2D a = Image2D::MakeZeroImage(10, 10);
  Image2D b = Image2D::MakeZeroImage(10, 10);
  Image2D c = Image2D::MakeZeroImage(10, 10);
  Image2D d = Image2D::MakeZeroImage(8, 10);
  c.SetValue(5, 5, 1.0);
  BOOST_CHECK(a == a);
  BOOST_CHECK(b == b);
  BOOST_CHECK(c == c);
  BOOST_CHECK(d == d);
  BOOST_CHECK(a == b);
  BOOST_CHECK(!(a == c));
  BOOST_CHECK(!(b == c));
  BOOST_CHECK(!(a == d));
  BOOST_CHECK(!(c == d));
}

BOOST_AUTO_TEST_CASE(all_finite) {
  Image2D image = Image2D::MakeZeroImage(10, 10);
  BOOST_CHECK(image.AllFinite());
  image.SetValue(9, 9, std::numeric_limits<num_t>::quiet_NaN());
  BOOST_CHECK(!image.AllFinite());
  image.SetValue(9, 9, std::numeric_limits<num_t>::infinity());
  BOOST_CHECK(!image.AllFinite());
  image.SetValue(9, 9, -std::numeric_limits<num_t>::infinity());
  BOOST_CHECK(!image.AllFinite());
}

BOOST_AUTO_TEST_CASE(make_finite_copy) {
  Image2D image = Image2D::MakeUnsetImage(10, 10);
  for (size_t y = 0; y != image.Height(); ++y) {
    for (size_t x = 0; x != image.Width(); ++x) {
      image.SetValue(x, y, x + y * image.Height());
    }
  }

  BOOST_CHECK(image.MakeFiniteCopy() == image);

  Image2D reference(image);
  reference.SetValue(4, 6, 0.0);

  image.SetValue(4, 6, std::numeric_limits<num_t>::quiet_NaN());
  BOOST_CHECK(image.MakeFiniteCopy() == reference);
  image.SetValue(4, 6, std::numeric_limits<num_t>::infinity());
  BOOST_CHECK(image.MakeFiniteCopy() == reference);
  image.SetValue(4, 6, -std::numeric_limits<num_t>::infinity());
  BOOST_CHECK(image.MakeFiniteCopy() == reference);
}

BOOST_AUTO_TEST_SUITE_END()