Coverage for adaptation/tests/test__init__.py: 100%

1"""Define the unit tests for the :mod:`colour.adaptation` module."""

2

3 from __future__ import annotations

4

5 import numpy as np

6

7 from colour.adaptation import chromatic_adaptation

8 from colour.constants import TOLERANCE_ABSOLUTE_TESTS

9 from colour.utilities import domain_range_scale

10

11 __author__ = "Colour Developers"

12 __copyright__ = "Copyright 2013 Colour Developers"

13 __license__ = "BSD-3-Clause - https://opensource.org/licenses/BSD-3-Clause"

14 __maintainer__ = "Colour Developers"

15 __email__ = "colour-developers@colour-science.org"

16 __status__ = "Production"

17

18 __all__ = [

19 "TestChromaticAdaptation",

20]

21

22

23 class TestChromaticAdaptation:

24 """

25 Define :func:`colour.adaptation.chromatic_adaptation` definition unit

26 tests methods.

27 """

28

29 def test_chromatic_adaptation(self) -> None:

30 """Test :func:`colour.adaptation.chromatic_adaptation` definition."""

31

32 XYZ = np.array([0.20654008, 0.12197225, 0.05136952])

33 XYZ_w = np.array([0.95045593, 1.00000000, 1.08905775])

34 XYZ_wr = np.array([0.96429568, 1.00000000, 0.82510460])

35 np.testing.assert_allclose(

36 chromatic_adaptation(XYZ, XYZ_w, XYZ_wr),

37 np.array([0.21638819, 0.12570000, 0.03847494]),

38 atol=TOLERANCE_ABSOLUTE_TESTS,

39 )

40

41 Y_o = 0.2

42 E_o = 1000

43 np.testing.assert_allclose(

44 chromatic_adaptation(

45 XYZ,

46 XYZ_w,

47 XYZ_wr,

48 method="CIE 1994",

49 Y_o=Y_o,

50 E_o1=E_o,

51 E_o2=E_o,

52 ),

53 np.array([0.21347453, 0.12252986, 0.03347887]),

54 atol=TOLERANCE_ABSOLUTE_TESTS,

55 )

56

57 L_A = 200

58 np.testing.assert_allclose(

59 chromatic_adaptation(

60 XYZ, XYZ_w, XYZ_wr, method="CMCCAT2000", L_A1=L_A, L_A2=L_A

61 ),

62 np.array([0.21498829, 0.12474711, 0.03910138]),

63 atol=TOLERANCE_ABSOLUTE_TESTS,

64 )

65

66 Y_n = 200

67 np.testing.assert_allclose(

68 chromatic_adaptation(XYZ, XYZ_w, XYZ_wr, method="Fairchild 1990", Y_n=Y_n),

69 np.array([0.21394049, 0.12262315, 0.03891917]),

70 atol=TOLERANCE_ABSOLUTE_TESTS,

71 )

72

73 np.testing.assert_allclose(

74 chromatic_adaptation(

75 XYZ, XYZ_w, XYZ_wr, method="Li 2025", L_A=100, F_surround=1

76 ),

77 np.array([0.21166965, 0.12234633, 0.03888754]),

78 atol=TOLERANCE_ABSOLUTE_TESTS,

79 )

80

81 np.testing.assert_allclose(

82 chromatic_adaptation(XYZ, XYZ_w, XYZ_wr, method="Zhai 2018", L_A=100),

83 np.array([0.21638819, 0.1257, 0.03847494]),

84 atol=TOLERANCE_ABSOLUTE_TESTS,

85 )

86

87 XYZ_wo = np.array([1.0, 1.0, 1.0])

88 np.testing.assert_allclose(

89 chromatic_adaptation(

90 XYZ, XYZ_w, XYZ_wr, method="Zhai 2018", L_A=100, XYZ_wo=XYZ_wo

91 ),

92 np.array([0.21638819, 0.1257, 0.03847494]),

93 atol=TOLERANCE_ABSOLUTE_TESTS,

94 )

95

96 np.testing.assert_allclose(

97 chromatic_adaptation(XYZ, XYZ_w, XYZ_wr, method="vK20"),

98 np.array([0.21468842, 0.12456164, 0.04662558]),

99 atol=TOLERANCE_ABSOLUTE_TESTS,

100 )

101

102 def test_domain_range_scale_chromatic_adaptation(self) -> None:

103 """

104 Test :func:`colour.adaptation.chromatic_adaptation` definition domain

105 and range scale support.

106 """

107

108 XYZ = np.array([0.20654008, 0.12197225, 0.05136952])

109 XYZ_w = np.array([0.95045593, 1.00000000, 1.08905775])

110 XYZ_wr = np.array([0.96429568, 1.00000000, 0.82510460])

111 Y_o = 0.2

112 E_o = 1000

113 L_A = 200

114 Y_n = 200

115

116 m = ("Von Kries", "CIE 1994", "CMCCAT2000", "Fairchild 1990")

117 v = [

118 chromatic_adaptation(

119 XYZ,

120 XYZ_w,

121 XYZ_wr,

122 method=method,

123 Y_o=Y_o,

124 E_o1=E_o,

125 E_o2=E_o,

126 L_A1=L_A,

127 L_A2=L_A,

128 Y_n=Y_n,

129 )

130 for method in m

131 ]

132

133 d_r = (("reference", 1), ("1", 1), ("100", 100))

134 for method, value in zip(m, v, strict=True):

135 for scale, factor in d_r:

136 with domain_range_scale(scale):

137 np.testing.assert_allclose(

138 chromatic_adaptation(

139 XYZ * factor,

140 XYZ_w * factor,

141 XYZ_wr * factor,

142 method=method,

143 Y_o=Y_o * factor,

144 E_o1=E_o,

145 E_o2=E_o,

146 L_A1=L_A,

147 L_A2=L_A,

148 Y_n=Y_n,

149 ),

150 value * factor,

151 atol=TOLERANCE_ABSOLUTE_TESTS,

152 )