scottwillson/racing_on_rails

View on GitHub
test_ruby/models/calculations/v3/steps/reject_more_than_results_per_event_test.rb

Summary

Maintainability
C
7 hrs
Test Coverage
# frozen_string_literal: true

require_relative "../../v3"

module Calculations
  module V3
    module Steps
      # :stopdoc:
      class RejectMoreThanResultsPerEventTest < Ruby::TestCase
        def test_calculate
          rules = Rules.new(
            points_for_place: [100, 75, 50, 20, 10],
            results_per_event: 3,
            team: true
          )
          calculator = Calculator.new(rules: rules, source_results: [])
          event_category = calculator.event_categories.first

          category = Models::Category.new("Women")
          participant = Models::Participant.new(0)
          event = Models::Event.new(id: 0)
          source_event_category = Models::EventCategory.new(category, event)

          4.times do |index|
            source_result = Models::SourceResult.new(
              id: index,
              event_category: source_event_category,
              participant: participant,
              place: 5 - index
            )
            result = Models::CalculatedResult.new(participant, [source_result])
            event_category.results << result
          end

          source_result = Models::SourceResult.new(
            id: 4,
            event_category: source_event_category,
            participant: participant,
            place: "DNF"
          )
          result = Models::CalculatedResult.new(participant, [source_result])
          event_category.results << result

          event_categories = RejectMoreThanResultsPerEvent.calculate!(calculator)
          results = event_categories.first.source_results.sort_by(&:id)
          assert_equal [0, 1, 2, 3, 4], results.map(&:id)

          assert results[0].rejected?
          assert_equal :results_per_event, results[0].rejection_reason
          assert !results[1].rejected?
          assert !results[2].rejected?
          assert !results[3].rejected?
          assert !results[4].rejected?
        end

        def test_do_not_reject_unplaced
          category_pro_1_2 = Models::Category.new("Category Pro/1/2 Women")
          category_rules = [
            Models::CategoryRule.new(category_pro_1_2)
          ]
          rules = Rules.new(
            category_rules: category_rules,
            results_per_event: 1
          )
          calculator = Calculator.new(rules: rules, source_results: [])
          event_category = calculator.event_categories.first

          participant = Models::Participant.new(0)
          cyclocross_bar = Models::Event.new(id: 10)
          source_event_category = Models::EventCategory.new(category_pro_1_2, cyclocross_bar)
          source_results = []
          source_results << Models::SourceResult.new(
            id: 100,
            event_category: source_event_category,
            participant: participant,
            place: 6,
            points: 295
          )

          gravel_bar = Models::Event.new(id: 11)
          source_event_category = Models::EventCategory.new(category_pro_1_2, gravel_bar)
          source_results << Models::SourceResult.new(
            id: 101,
            event_category: source_event_category,
            participant: participant,
            place: 11,
            points: 290
          )

          category_1_women = Models::Category.new("Category 1 Women")
          mtb_bar = Models::Event.new(id: 12)
          source_event_category = Models::EventCategory.new(category_1_women, mtb_bar)
          source_results << Models::SourceResult.new(
            id: 102,
            event_category: source_event_category,
            participant: participant,
            place: 12,
            points: 289
          )

          category_2_women = Models::Category.new("Category 2 Women")
          source_event_category = Models::EventCategory.new(category_2_women, mtb_bar)
          source_results << Models::SourceResult.new(
            id: 103,
            event_category: source_event_category,
            participant: participant,
            place: nil,
            points: 0
          )

          tt_bar = Models::Event.new(id: 13)
          source_event_category = Models::EventCategory.new(category_pro_1_2, tt_bar)
          source_results << Models::SourceResult.new(
            id: 104,
            event_category: source_event_category,
            participant: participant,
            place: nil,
            points: 0
          )

          road_bar = Models::Event.new(id: 14)
          source_event_category = Models::EventCategory.new(category_pro_1_2, road_bar)
          source_results << Models::SourceResult.new(
            id: 105,
            event_category: source_event_category,
            participant: participant,
            place: nil,
            points: 0
          )

          result = Models::CalculatedResult.new(participant, source_results)
          event_category.results << result

          event_categories = RejectMoreThanResultsPerEvent.calculate!(calculator)
          results = event_categories.first.source_results.sort_by(&:id)
          assert_equal [100, 101, 102, 103, 104, 105], results.map(&:id)

          assert !results[0].rejected?
          assert !results[1].rejected?
          assert !results[2].rejected?
          assert !results[3].rejected?
          assert !results[4].rejected?
          assert !results[5].rejected?
        end

        def test_bar
          category_pro_1_2 = Models::Category.new("Category Pro/1/2 Women")
          category_3 = Models::Category.new("Category 3 Women")
          category_rules = [
            Models::CategoryRule.new(category_pro_1_2),
            Models::CategoryRule.new(category_3)
          ]
          rules = Rules.new(
            category_rules: category_rules,
            results_per_event: 1
          )
          calculator = Calculator.new(rules: rules, source_results: [])
          pro_1_2_event_category = calculator.event_categories.detect { |ec| ec.category == category_pro_1_2 }
          women_3_event_category = calculator.event_categories.detect { |ec| ec.category == category_3 }

          participant = Models::Participant.new(0)
          gravel_bar = Models::Event.new(id: 10)
          source_event_category = Models::EventCategory.new(category_pro_1_2, gravel_bar)
          source_results = []
          source_results << Models::SourceResult.new(
            id: 100,
            event_category: source_event_category,
            participant: participant,
            place: 19,
            points: 282
          )

          elite_women = Models::Category.new("Elite Women")
          mtb_bar = Models::Event.new(id: 11)
          source_event_category = Models::EventCategory.new(elite_women, mtb_bar)
          source_results << Models::SourceResult.new(
            id: 101,
            event_category: source_event_category,
            participant: participant,
            place: 15,
            points: 286
          )

          category_2_women = Models::Category.new("Category 2 Women")
          stxc_bar = Models::Event.new(id: 12)
          source_event_category = Models::EventCategory.new(category_2_women, stxc_bar)
          source_results << Models::SourceResult.new(
            id: 102,
            event_category: source_event_category,
            participant: participant,
            place: 1,
            points: 300
          )

          cx_bar = Models::Event.new(id: 13)
          source_event_category = Models::EventCategory.new(category_pro_1_2, cx_bar)
          source_results << Models::SourceResult.new(
            id: 103,
            event_category: source_event_category,
            participant: participant,
            place: 3,
            points: 297
          )

          road_bar = Models::Event.new(id: 14)
          source_event_category = Models::EventCategory.new(category_pro_1_2, road_bar)
          source_results << Models::SourceResult.new(
            id: 104,
            event_category: source_event_category,
            participant: participant,
            place: 27,
            points: 273
          )

          result = Models::CalculatedResult.new(participant, source_results)
          pro_1_2_event_category.results << result

          source_results = []
          source_event_category = Models::EventCategory.new(category_3, road_bar)
          source_results << Models::SourceResult.new(
            id: 105,
            event_category: source_event_category,
            participant: participant,
            place: 2,
            points: 299
          )

          result = Models::CalculatedResult.new(participant, source_results)
          women_3_event_category.results << result

          event_categories = RejectMoreThanResultsPerEvent.calculate!(calculator)

          event_category = event_categories.detect { |ec| ec.category == pro_1_2_event_category }
          rejected_results = event_category.source_results.select(&:rejected?)
          assert rejected_results.empty?, "Results #{rejected_results.map(&:id)} were rejected"

          event_category = event_categories.detect { |ec| ec.category == category_3 }
          assert event_category.source_results.none?(&:rejected?)
        end
      end
    end
  end
end