1 // Unit tests for EffectChain.
3 // Note that this also contains the tests for some of the simpler effects.
5 #include "effect_chain.h"
6 #include "flat_input.h"
7 #include "gtest/gtest.h"
8 #include "mirror_effect.h"
10 #include "test_util.h"
12 TEST(EffectChainTest, EmptyChain) {
18 EffectChainTester tester(data, 3, 2, FORMAT_GRAYSCALE, COLORSPACE_sRGB, GAMMA_LINEAR);
19 tester.run(out_data, GL_RED, COLORSPACE_sRGB, GAMMA_LINEAR);
21 expect_equal(data, out_data, 3, 2);
24 // An effect that does nothing.
25 class IdentityEffect : public Effect {
28 virtual std::string effect_type_id() const { return "IdentityEffect"; }
29 std::string output_fragment_shader() { return read_file("identity.frag"); }
32 TEST(EffectChainTest, Identity) {
38 EffectChainTester tester(data, 3, 2, FORMAT_GRAYSCALE, COLORSPACE_sRGB, GAMMA_LINEAR);
39 tester.get_chain()->add_effect(new IdentityEffect());
40 tester.run(out_data, GL_RED, COLORSPACE_sRGB, GAMMA_LINEAR);
42 expect_equal(data, out_data, 3, 2);
45 // An effect that does nothing, but requests texture bounce.
46 class BouncingIdentityEffect : public Effect {
48 BouncingIdentityEffect() {}
49 virtual std::string effect_type_id() const { return "IdentityEffect"; }
50 std::string output_fragment_shader() { return read_file("identity.frag"); }
51 bool needs_texture_bounce() const { return true; }
54 TEST(EffectChainTest, TextureBouncePreservesIdentity) {
60 EffectChainTester tester(data, 3, 2, FORMAT_GRAYSCALE, COLORSPACE_sRGB, GAMMA_LINEAR);
61 tester.get_chain()->add_effect(new BouncingIdentityEffect());
62 tester.run(out_data, GL_RED, COLORSPACE_sRGB, GAMMA_LINEAR);
64 expect_equal(data, out_data, 3, 2);
67 TEST(MirrorTest, BasicTest) {
72 float expected_data[6] = {
77 EffectChainTester tester(data, 3, 2, FORMAT_GRAYSCALE, COLORSPACE_sRGB, GAMMA_LINEAR);
78 tester.get_chain()->add_effect(new MirrorEffect());
79 tester.run(out_data, GL_RED, COLORSPACE_sRGB, GAMMA_LINEAR);
81 expect_equal(expected_data, out_data, 3, 2);
84 // The identity effect needs linear light, and thus will get conversions on both sides.
85 // Verify that sRGB data is properly converted to and from linear light for the entire ramp.
86 TEST(EffectChainTest, IdentityThroughsRGBConversions) {
88 for (unsigned i = 0; i < 256; ++i) {
92 EffectChainTester tester(data, 256, 1, FORMAT_GRAYSCALE, COLORSPACE_sRGB, GAMMA_sRGB);
93 tester.get_chain()->add_effect(new IdentityEffect());
94 tester.run(out_data, GL_RED, COLORSPACE_sRGB, GAMMA_sRGB);
96 expect_equal(data, out_data, 256, 1);
99 // Same, for the Rec. 601/709 gamma curve.
100 TEST(EffectChainTest, IdentityThroughRec709) {
102 for (unsigned i = 0; i < 256; ++i) {
106 EffectChainTester tester(data, 256, 1, FORMAT_GRAYSCALE, COLORSPACE_sRGB, GAMMA_REC_709);
107 tester.get_chain()->add_effect(new IdentityEffect());
108 tester.run(out_data, GL_RED, COLORSPACE_sRGB, GAMMA_REC_709);
110 expect_equal(data, out_data, 256, 1);