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 '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', __FILE__ path = "#{dir}/#{name}" FileUtils.mkdir_p dir File.write path, content yield path ensure FileUtils.rm_rf path end end