class Tryouts::ExpectationEvaluators::IntentionalFailure
-
Provides clear messaging about intentional failure semantics
- Inverts the passed result while preserving actual/expected values
- Delegates evaluation to Regular evaluator
- Creates a temporary regular expectation with same content
DELEGATION PATTERN:
- Part of unified #= prefix convention for all expectation types
- Clear messaging indicates this is an intentional failure test
- Preserves original expectation details for debugging
- Delegates to regular evaluator to maintain consistency
- Uses #=<> syntax (angle brackets suggest “opposite/inverted direction”)
DESIGN DECISIONS:
- Inverts only the final passed/failed status, preserving other metadata
- Actual display shows the test result value
- Expected display shows the evaluated expression result for clarity
- Expression has access to ‘result` and `_` variables (actual_result)
- Uses delegation pattern to wrap the regular evaluator
IMPLEMENTATION DETAILS:
- Preserves all error details and content from underlying expectation
- If underlying expectation would fail, intentional failure passes
- If underlying expectation would pass, intentional failure fails
- Takes any valid expectation expression and inverts the result
FAILURE INVERSION:
“test” #=<> /d+/ # Pass: “test” doesn’t match digits
[1, 2, 3] #=<> result.empty? # Pass: array is not empty
“hello” #=<> result.include?(“x”) # Pass: “hello” doesn’t contain “x”
1 + 1 #=<> 3 # Pass: 1+1 ≠ 3, so failure expected
Examples:
SYNTAX: #=<> expression
- Useful for testing error conditions and boundary cases
- Provides ability to test negative cases and expected failures
- Validates that an expectation intentionally fails (passes when the underlying expectation fails)
PURPOSE:
Evaluator for intentional failure expectations using syntax: #=<> expression
def self.handles?(expectation_type)
def self.handles?(expectation_type) expectation_type == :intentional_failure end
def evaluate(actual_result = nil)
def evaluate(actual_result = nil) # Create a temporary regular expectation for delegation regular_expectation = Expectation.new(content: @expectation.content, type: :regular) # Delegate to regular evaluator regular_evaluator = Regular.new(regular_expectation, @test_case, @context) regular_result = regular_evaluator.evaluate(actual_result) # Invert the result while preserving metadata build_result( passed: !regular_result[:passed], actual: regular_result[:actual], expected: "NOT #{regular_result[:expected]} (intentional failure)", expectation: @expectation.content, ) rescue StandardError => ex # If evaluation itself fails (not the expectation), that's a real error handle_evaluation_error(ex, actual_result) end