scottwillson/racing_on_rails

View on GitHub
test_ruby/models/competitions/calculations/points_test.rb

Summary

Maintainability
D
2 days
Test Coverage
# frozen_string_literal: true

require_relative "../../../../app/models/competitions/calculations/calculator"
require_relative "calculations_test"

# :stopdoc:
module Competitions
  module Calculations
    class PointsTest < CalculationsTest
      def test_points
        assert_equal 1, Calculator.points(result(place: 20), break_ties: false)
      end

      def test_points_with_point_schedule
        rules = { point_schedule: [15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1] }
        assert_equal 0, Calculator.points(result(place: "20"), rules)
        assert_equal 1, Calculator.points(result(place: "15"), rules)
        assert_equal 14, Calculator.points(result(place: 2), rules)
        assert_equal 0, Calculator.points(result(place: ""), rules)
        assert_equal 0, Calculator.points(result(place: nil), rules)
        assert_equal 0, Calculator.points(result(place: "DNF"), rules)
        assert_equal 0, Calculator.points(result(place: "DQ"), rules)
      end

      def test_points_with_point_schedule_hash
        rules = {
          point_schedule: {
            0 => [15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1],
            1 => [8, 5, 3]
          }
        }
        assert_equal 13, Calculator.points(result(event_id: 0, place: "3"), rules)
        assert_equal 3, Calculator.points(result(event_id: 1, place: "3"), rules)
      end

      def test_points_considers_team_size
        rules = { point_schedule: [15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1] }
        assert_equal 0, Calculator.points(result(place: "20", team_size: 2), rules)
        assert_equal 0.5, Calculator.points(result(place: "15", team_size: 2), rules)
        assert_equal 7, Calculator.points(result(place: 2, team_size: 2), rules)
        assert_equal 0, Calculator.points(result(place: "", team_size: 2), rules)
        assert_equal 0, Calculator.points(result(place: nil, team_size: 2), rules)
        assert_equal 0, Calculator.points(result(place: "DNF", team_size: 2), rules)
        assert_equal 0, Calculator.points(result(place: "DQ", team_size: 2), rules)
        assert_equal 0, Calculator.points(result(place: "20", team_size: 3), rules)
        assert_in_delta 0.333, Calculator.points(result(place: "15", team_size: 3), rules)
        assert_in_delta 4.666, Calculator.points(result(place: 2, team_size: 3), rules)
        assert_equal 0, Calculator.points(result(place: "", team_size: 3), rules)
        assert_equal 0, Calculator.points(result(place: nil, team_size: 3), rules)
        assert_equal 0, Calculator.points(result(place: "DNF", team_size: 3), rules)
        assert_equal 0, Calculator.points(result(place: "DQ", team_size: 3), rules)
      end

      def test_points_considers_multiplier
        assert_equal 27, Calculator.points(result(place: "7", multiplier: 3), point_schedule: [15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1])
        assert_equal 0, Calculator.points(result(place: "7", multiplier: 0), point_schedule: [15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1])
      end

      def test_points_considers_multiplier_and_team_size
        assert_in_delta 9.333, 0.1, Calculator.points(
          result(place: "2", multiplier: 2, team_size: 3),
          point_schedule: [15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
        )
      end

      def test_points_considers_field_size
        assert_equal 9, Calculator.points(result(place: "7", field_size: 74), point_schedule: [15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1], field_size_bonus: true)
        assert_equal 13.5, Calculator.points(result(place: "7", field_size: 75), point_schedule: [15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1], field_size_bonus: true)
        assert_equal 13.5, Calculator.points(result(place: "7", field_size: 76), point_schedule: [15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1], field_size_bonus: true)
      end

      def test_points_ignore_field_size_if_multipler
        assert_equal 27, Calculator.points(result(place: "7", multiplier: 3, field_size: 74), point_schedule: [15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1], field_size_bonus: true)
        assert_equal 27, Calculator.points(result(place: "7", multiplier: 3, field_size: 75), point_schedule: [15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1], field_size_bonus: true)
        assert_equal 27, Calculator.points(result(place: "7", multiplier: 3, field_size: 76), point_schedule: [15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1], field_size_bonus: true)
      end

      def test_points_use_source_result_points
        assert_equal 11, Calculator.points(
          result(place: "2", multiplier: 2, points: 11),
          point_schedule: [3, 2, 1],
          use_source_result_points: true
        )
      end

      def test_points_upgrade
        assert_equal 5.5, Calculator.points(
          result(place: "2", points: 11, upgrade: true),
          maximum_upgrade_points: 100,
          point_schedule: [3, 2, 1],
          use_source_result_points: false,
          upgrade_points_multiplier: 0.50
        )
      end

      def test_calculate_double_points_for_last_event
        rules = { double_points_for_last_event: true, end_date: Date.new(2014, 10), point_schedule: [15, 14, 13], members_only: false }
        source_results = [
          { "event_id" => 1, "race_id" => 1, "participant_id" => 1, "place" => "1", "date" => Date.new(2014, 9) },
          { "event_id" => 2, "race_id" => 2, "participant_id" => 1, "place" => "2", "date" => Date.new(2014, 10) }
        ]
        expected = [
          result(place: 1, participant_id: 1, points: 43.0, scores: [
                   { numeric_place: 1, participant_id: 1, points: 15.0, date: Date.new(2014, 9), event_id: 1 },
                   { numeric_place: 2, participant_id: 1, points: 28.0, date: Date.new(2014, 10), event_id: 2 }
                 ])
        ]
        actual = Calculator.calculate(source_results, rules)
        assert_equal_results expected, actual
      end

      def test_double_points_and_maximum_events
        rules = { double_points_for_last_event: true, maximum_events: 5, end_date: Date.new(2014, 7, 9), point_schedule: [100, 70, 50, 40, 36, 32, 28, 24, 20, 16, 15, 14, 13, 12, 11], members_only: false }
        source_results = [
          { "place" => "10", "date" => Date.new(2014, 6, 4), "event_id" => 1, "race_id" => 1, "participant_id" => 1 },
          { "place" => "9", "date" => Date.new(2014, 6, 11), "event_id" => 2, "race_id" => 2, "participant_id" => 1 },
          { "place" => "3", "date" => Date.new(2014, 6, 18), "event_id" => 3, "race_id" => 3, "participant_id" => 1 },
          { "place" => "4", "date" => Date.new(2014, 6, 25), "event_id" => 4, "race_id" => 4, "participant_id" => 1 },
          { "place" => "2", "date" => Date.new(2014, 7, 2), "event_id" => 5, "race_id" => 5, "participant_id" => 1 },
          { "place" => "1", "date" => Date.new(2014, 7, 9), "event_id" => 6, "race_id" => 6, "participant_id" => 1 }
        ]
        expected = [
          result(place: 1, participant_id: 1, points: 380, scores: [
                   { numeric_place: 1, participant_id: 1, points: 200, date: Date.new(2014, 7, 9), event_id: 6 },
                   { numeric_place: 2, participant_id: 1, points: 70, date: Date.new(2014, 7, 2), event_id: 5 },
                   { numeric_place: 3, participant_id: 1, points: 50, date: Date.new(2014, 6, 18), event_id: 3 },
                   { numeric_place: 4, participant_id: 1, points: 40, date: Date.new(2014, 6, 25), event_id: 4 },
                   { numeric_place: 9, participant_id: 1, points: 20, date: Date.new(2014, 6, 11), event_id: 2 }
                 ])
        ]
        actual = Calculator.calculate(source_results, rules)
        assert_equal_results expected, actual
      end

      def test_last_event_should_be_more_points
        rules = { double_points_for_last_event: true, maximum_events: 5, end_date: Date.new(2014, 7, 9), point_schedule: [100, 70, 50, 40, 36, 32, 28, 24, 20, 16, 15, 14, 13, 12, 11], members_only: false }
        source_results = [
          { "place" => "1", "date" => Date.new(2014, 6, 4), "event_id" => 1, "race_id" => 1, "participant_id" => 1 },
          { "place" => "3", "date" => Date.new(2014, 6, 11), "event_id" => 2, "race_id" => 2, "participant_id" => 1 },
          { "place" => "1", "date" => Date.new(2014, 6, 18), "event_id" => 3, "race_id" => 3, "participant_id" => 1 },
          { "place" => "1", "date" => Date.new(2014, 6, 25), "event_id" => 4, "race_id" => 4, "participant_id" => 1 },
          { "place" => "1", "date" => Date.new(2014, 7, 2), "event_id" => 5, "race_id" => 5, "participant_id" => 1 },
          { "place" => "2", "date" => Date.new(2014, 7, 9), "event_id" => 6, "race_id" => 6, "participant_id" => 1 }
        ]
        expected = [
          result(place: 1, participant_id: 1, points: 540, scores: [
                   { numeric_place: 1, participant_id: 1, points: 100, date: Date.new(2014, 6, 4), event_id: 1 },
                   { numeric_place: 1, participant_id: 1, points: 100, date: Date.new(2014, 6, 18), event_id: 3 },
                   { numeric_place: 1, participant_id: 1, points: 100, date: Date.new(2014, 6, 25), event_id: 4 },
                   { numeric_place: 1, participant_id: 1, points: 100, date: Date.new(2014, 7, 2), event_id: 5 },
                   { numeric_place: 2, participant_id: 1, points: 140, date: Date.new(2014, 7, 9), event_id: 6 }
                 ])
        ]
        actual = Calculator.calculate(source_results, rules)
        assert_equal_results expected, actual
      end

      def test_double_points_for_last_event
        assert_equal 6, Calculator.points(
          result(place: "3", date: Date.new(2015, 4, 2)),
          end_date: Date.new(2015, 4, 2),
          point_schedule: [7, 5, 3],
          double_points_for_last_event: true
        )
      end

      def test_points_schedule_from_field_size
        assert_equal 26, Calculator.points(
          result(place: "4", field_size: 29),
          points_schedule_from_field_size: true
        )

        assert_equal 75, Calculator.points(
          result(place: "1", field_size: 75),
          points_schedule_from_field_size: true
        )

        assert_equal 1, Calculator.points(
          result(place: "75", field_size: 75),
          points_schedule_from_field_size: true
        )
      end

      def test_place_bonus
        assert_equal 26, Calculator.points(
          result(place: "4", field_size: 29),
          place_bonus: [7, 5, 3],
          points_schedule_from_field_size: true
        )

        assert_equal 82, Calculator.points(
          result(place: "1", field_size: 75),
          place_bonus: [7, 5, 3],
          points_schedule_from_field_size: true
        )

        assert_equal 1, Calculator.points(
          result(place: "75", field_size: 75),
          place_bonus: [7, 5, 3],
          points_schedule_from_field_size: true
        )

        assert_equal 76, Calculator.points(
          result(place: "3", field_size: 75),
          place_bonus: [7, 5, 3],
          points_schedule_from_field_size: true
        )
      end
    end
  end
end