lib/mutest/reporter/cli/printer/env_progress.rb
module Mutest
  class Reporter
    class CLI
      class Printer
        # Env progress printer
        class EnvProgress < self
          delegate(
            :coverage,
            :amount_subjects,
            :amount_mutations,
            :amount_mutations_alive,
            :amount_mutations_killed,
            :amount_mutation_results,
            :runtime,
            :killtime,
            :overhead,
            :env
          )

          # rubocop:disable Layout/SpaceInsideArrayLiteralBrackets
          FORMATS = IceNine.deep_freeze([
            [:info,   'Subjects:        %s',      :amount_subjects        ],
            [:info,   'Mutations:       %s',      :amount_mutations       ],
            [:info,   'Results:         %s',      :amount_mutation_results],
            [:info,   'Kills:           %s',      :amount_mutations_killed],
            [:info,   'Alive:           %s',      :amount_mutations_alive ],
            [:info,   'Runtime:         %0.2fs',  :runtime                ],
            [:info,   'Killtime:        %0.2fs',  :killtime               ],
            [:info,   'Overhead:        %0.2f%%', :overhead_percent       ],
            [:info,   'Mutations/s:     %0.2f',   :mutations_per_second   ],
            [:status, 'Coverage:        %0.2f%%', :coverage_percent       ]
          ])

          # Run printer
          #
          # @return [undefined]
          def run
            visit(Config, env.config)
            FORMATS.each do |report, format, value|
              __send__(report, format, __send__(value))
            end
          end

          private

          # Mutations processed per second
          #
          # @return [Float]
          #
          # @api private
          def mutations_per_second
            amount_mutation_results / runtime
          end

          # Coverage in percent
          #
          # @return [Float]
          #
          # @api private
          def coverage_percent
            coverage * 100
          end

          # Overhead in percent
          #
          # @return [Float]
          #
          # @api private
          def overhead_percent
            (overhead / killtime) * 100
          end
        end
      end
    end
  end
end
