#include "paint/brush.h" #include "test_harness.h" #include using pp::foundation::StatusCode; using pp::paint::BrushParams; using pp::paint::evaluate_brush_stamp; using pp::paint::max_brush_size; using pp::paint::min_brush_size; using pp::paint::validate_brush_params; namespace { bool near(float a, float b) { return std::fabs(a - b) < 0.0001F; } void accepts_default_and_boundary_params(pp::tests::Harness& h) { BrushParams defaults; BrushParams minimums { .size = min_brush_size, .spacing = 0.01F, .opacity = 0.0F, .flow = 0.0F, .angle_degrees = -360.0F, .size_jitter = 0.0F, .opacity_jitter = 0.0F, }; BrushParams maximums { .size = max_brush_size, .spacing = 16.0F, .opacity = 1.0F, .flow = 1.0F, .angle_degrees = 360.0F, .size_jitter = 1.0F, .opacity_jitter = 1.0F, }; PP_EXPECT(h, validate_brush_params(defaults).ok()); PP_EXPECT(h, validate_brush_params(minimums).ok()); PP_EXPECT(h, validate_brush_params(maximums).ok()); } void rejects_invalid_params(pp::tests::Harness& h) { BrushParams params; params.size = 0.0F; PP_EXPECT(h, validate_brush_params(params).code == StatusCode::out_of_range); params = BrushParams {}; params.spacing = 0.0F; PP_EXPECT(h, validate_brush_params(params).code == StatusCode::out_of_range); params = BrushParams {}; params.opacity = -0.1F; PP_EXPECT(h, validate_brush_params(params).code == StatusCode::out_of_range); params = BrushParams {}; params.flow = 1.1F; PP_EXPECT(h, validate_brush_params(params).code == StatusCode::out_of_range); params = BrushParams {}; params.angle_degrees = 361.0F; PP_EXPECT(h, validate_brush_params(params).code == StatusCode::out_of_range); params = BrushParams {}; params.size_jitter = std::nanf(""); PP_EXPECT(h, validate_brush_params(params).code == StatusCode::out_of_range); params = BrushParams {}; params.opacity_jitter = 2.0F; PP_EXPECT(h, validate_brush_params(params).code == StatusCode::out_of_range); } void evaluates_pressure_controlled_stamp(pp::tests::Harness& h) { const BrushParams params { .size = 20.0F, .spacing = 0.5F, .opacity = 0.8F, .flow = 0.6F, .angle_degrees = 45.0F, .size_jitter = 0.0F, .opacity_jitter = 0.0F, .pressure_controls_size = true, .pressure_controls_opacity = true, }; const auto stamp = evaluate_brush_stamp(params, 0.5F); PP_EXPECT(h, near(stamp.size, 10.0F)); PP_EXPECT(h, near(stamp.opacity, 0.4F)); PP_EXPECT(h, near(stamp.flow, 0.6F)); PP_EXPECT(h, near(stamp.angle_degrees, 45.0F)); } void clamps_bad_pressure_and_applies_deterministic_jitter_scale(pp::tests::Harness& h) { const BrushParams params { .size = 20.0F, .spacing = 0.5F, .opacity = 0.8F, .flow = 0.6F, .angle_degrees = 0.0F, .size_jitter = 0.5F, .opacity_jitter = 1.0F, .pressure_controls_size = false, .pressure_controls_opacity = false, }; const auto nan_pressure = evaluate_brush_stamp(params, std::nanf("")); const auto high_pressure = evaluate_brush_stamp(params, 2.0F); PP_EXPECT(h, near(nan_pressure.size, 15.0F)); PP_EXPECT(h, near(nan_pressure.opacity, 0.4F)); PP_EXPECT(h, near(high_pressure.size, 15.0F)); PP_EXPECT(h, near(high_pressure.opacity, 0.4F)); } } int main() { pp::tests::Harness harness; harness.run("accepts_default_and_boundary_params", accepts_default_and_boundary_params); harness.run("rejects_invalid_params", rejects_invalid_params); harness.run("evaluates_pressure_controlled_stamp", evaluates_pressure_controlled_stamp); harness.run("clamps_bad_pressure_and_applies_deterministic_jitter_scale", clamps_bad_pressure_and_applies_deterministic_jitter_scale); return harness.finish(); }