rails--rails/railties/test/code_statistics_calculator_...

386 lines
9.0 KiB
Ruby

# frozen_string_literal: true
require "abstract_unit"
require "rails/code_statistics_calculator"
class CodeStatisticsCalculatorTest < ActiveSupport::TestCase
def setup
@code_statistics_calculator = CodeStatisticsCalculator.new
end
test "calculate statistics using #add_by_file_path" do
code = <<-RUBY
def foo
puts 'foo'
# bar
end
RUBY
temp_file "stats.rb", code do |path|
@code_statistics_calculator.add_by_file_path path
assert_equal 4, @code_statistics_calculator.lines
assert_equal 3, @code_statistics_calculator.code_lines
assert_equal 0, @code_statistics_calculator.classes
assert_equal 1, @code_statistics_calculator.methods
end
end
test "count number of methods in minitest file" do
code = <<-RUBY
class FooTest < ActionController::TestCase
test 'expectation' do
assert true
end
def test_expectation
assert true
end
end
RUBY
temp_file "foo_test.rb", code do |path|
@code_statistics_calculator.add_by_file_path path
assert_equal 2, @code_statistics_calculator.methods
end
end
test "add statistics to another using #add" do
code_statistics_calculator_1 = CodeStatisticsCalculator.new(1, 2, 3, 4)
@code_statistics_calculator.add(code_statistics_calculator_1)
assert_equal 1, @code_statistics_calculator.lines
assert_equal 2, @code_statistics_calculator.code_lines
assert_equal 3, @code_statistics_calculator.classes
assert_equal 4, @code_statistics_calculator.methods
code_statistics_calculator_2 = CodeStatisticsCalculator.new(2, 3, 4, 5)
@code_statistics_calculator.add(code_statistics_calculator_2)
assert_equal 3, @code_statistics_calculator.lines
assert_equal 5, @code_statistics_calculator.code_lines
assert_equal 7, @code_statistics_calculator.classes
assert_equal 9, @code_statistics_calculator.methods
end
test "accumulate statistics using #add_by_io" do
code_statistics_calculator_1 = CodeStatisticsCalculator.new(1, 2, 3, 4)
@code_statistics_calculator.add(code_statistics_calculator_1)
code = <<-'CODE'
def foo
puts 'foo'
end
def bar; end
class A; end
CODE
@code_statistics_calculator.add_by_io(StringIO.new(code), :rb)
assert_equal 7, @code_statistics_calculator.lines
assert_equal 7, @code_statistics_calculator.code_lines
assert_equal 4, @code_statistics_calculator.classes
assert_equal 6, @code_statistics_calculator.methods
end
test "calculate number of Ruby methods" do
code = <<-'CODE'
def foo
puts 'foo'
end
def bar; end
class Foo
def bar(abc)
end
end
CODE
@code_statistics_calculator.add_by_io(StringIO.new(code), :rb)
assert_equal 3, @code_statistics_calculator.methods
end
test "calculate Ruby LOCs" do
code = <<-'CODE'
def foo
puts 'foo'
end
# def bar; end
class A < B
end
CODE
@code_statistics_calculator.add_by_io(StringIO.new(code), :rb)
assert_equal 8, @code_statistics_calculator.lines
assert_equal 5, @code_statistics_calculator.code_lines
end
test "calculate number of Ruby classes" do
code = <<-'CODE'
class Foo < Bar
def foo
puts 'foo'
end
end
class Z; end
# class A
# end
CODE
@code_statistics_calculator.add_by_io(StringIO.new(code), :rb)
assert_equal 2, @code_statistics_calculator.classes
end
test "skip Ruby comments" do
code = <<-'CODE'
=begin
class Foo
def foo
puts 'foo'
end
end
=end
# class A
# end
CODE
@code_statistics_calculator.add_by_io(StringIO.new(code), :rb)
assert_equal 10, @code_statistics_calculator.lines
assert_equal 0, @code_statistics_calculator.code_lines
assert_equal 0, @code_statistics_calculator.classes
assert_equal 0, @code_statistics_calculator.methods
end
test "calculate number of JS methods" do
code = <<-'CODE'
function foo(x, y, z) {
doX();
}
$(function () {
bar();
})
var baz = function ( x ) {
}
CODE
@code_statistics_calculator.add_by_io(StringIO.new(code), :js)
assert_equal 3, @code_statistics_calculator.methods
end
test "calculate JS LOCs" do
code = <<-'CODE'
function foo()
alert('foo');
end
// var b = 2;
var a = 1;
CODE
@code_statistics_calculator.add_by_io(StringIO.new(code), :js)
assert_equal 7, @code_statistics_calculator.lines
assert_equal 4, @code_statistics_calculator.code_lines
end
test "skip JS comments" do
code = <<-'CODE'
/*
* var f = function () {
1 / 2;
}
*/
// call();
//
CODE
@code_statistics_calculator.add_by_io(StringIO.new(code), :js)
assert_equal 8, @code_statistics_calculator.lines
assert_equal 0, @code_statistics_calculator.code_lines
assert_equal 0, @code_statistics_calculator.classes
assert_equal 0, @code_statistics_calculator.methods
end
test "skip ERB comments" do
code = <<-'CODE'
<!-- This is an HTML comment -->
<%# This is a great comment! %>
<div>
<%= hello %>
</div>
CODE
@code_statistics_calculator.add_by_io(StringIO.new(code), :erb)
assert_equal 6, @code_statistics_calculator.lines
assert_equal 3, @code_statistics_calculator.code_lines
assert_equal 0, @code_statistics_calculator.classes
assert_equal 0, @code_statistics_calculator.methods
end
test "skip CSS comments" do
code = <<-'CODE'
/* My cool CSS */
.selector {
background-color: blue;
}
CODE
@code_statistics_calculator.add_by_io(StringIO.new(code), :css)
assert_equal 5, @code_statistics_calculator.lines
assert_equal 3, @code_statistics_calculator.code_lines
assert_equal 0, @code_statistics_calculator.classes
assert_equal 0, @code_statistics_calculator.methods
end
test "skip SCSS comments" do
code = <<-'CODE'
// My cool SCSS
/* My cool SCSS */
.selector {
background-color: blue;
}
CODE
@code_statistics_calculator.add_by_io(StringIO.new(code), :scss)
assert_equal 6, @code_statistics_calculator.lines
assert_equal 3, @code_statistics_calculator.code_lines
assert_equal 0, @code_statistics_calculator.classes
assert_equal 0, @code_statistics_calculator.methods
end
test "calculate number of CoffeeScript methods" do
code = <<-'CODE'
square = (x) -> x * x
math =
cube: (x) -> x * square x
fill = (container, liquid = "coffee") ->
"Filling the #{container} with #{liquid}..."
$('.shopping_cart').bind 'click', (event) =>
@customer.purchase @cart
CODE
@code_statistics_calculator.add_by_io(StringIO.new(code), :coffee)
assert_equal 4, @code_statistics_calculator.methods
end
test "calculate CoffeeScript LOCs" do
code = <<-'CODE'
# Assignment:
number = 42
opposite = true
###
CoffeeScript Compiler v1.4.0
Released under the MIT License
###
# Conditions:
number = -42 if opposite
CODE
@code_statistics_calculator.add_by_io(StringIO.new(code), :coffee)
assert_equal 11, @code_statistics_calculator.lines
assert_equal 3, @code_statistics_calculator.code_lines
end
test "calculate number of CoffeeScript classes" do
code = <<-'CODE'
class Animal
constructor: (@name) ->
move: (meters) ->
alert @name + " moved #{meters}m."
class Snake extends Animal
move: ->
alert "Slithering..."
super 5
# class Horse
CODE
@code_statistics_calculator.add_by_io(StringIO.new(code), :coffee)
assert_equal 2, @code_statistics_calculator.classes
end
test "skip CoffeeScript comments" do
code = <<-'CODE'
###
class Animal
constructor: (@name) ->
move: (meters) ->
alert @name + " moved #{meters}m."
###
# class Horse
alert 'hello'
CODE
@code_statistics_calculator.add_by_io(StringIO.new(code), :coffee)
assert_equal 10, @code_statistics_calculator.lines
assert_equal 1, @code_statistics_calculator.code_lines
assert_equal 0, @code_statistics_calculator.classes
assert_equal 0, @code_statistics_calculator.methods
end
test "count rake tasks" do
code = <<-'CODE'
task :test_task do
puts 'foo'
end
CODE
@code_statistics_calculator.add_by_io(StringIO.new(code), :rake)
assert_equal 4, @code_statistics_calculator.lines
assert_equal 3, @code_statistics_calculator.code_lines
assert_equal 0, @code_statistics_calculator.classes
assert_equal 0, @code_statistics_calculator.methods
end
private
def temp_file(name, content)
dir = File.expand_path "fixtures/tmp", __dir__
path = "#{dir}/#{name}"
FileUtils.mkdir_p dir
File.write path, content
yield path
ensure
FileUtils.rm_rf path
end
end