##################################################################### # wc_spec.rb # # Specs for the File.wc method. These specs should be run via # the 'rake wc' task. ##################################################################### require 'rspec' require 'ptools' RSpec.describe File, :wc do let(:test_file) { 'test_file_wc.txt' } before do described_class.open(test_file, 'w'){ |fh| 25.times{ |n| fh.puts "line#{n+1}" } } end after do described_class.delete(test_file) if described_class.exist?(test_file) end example 'wc method basic functionality' do expect(described_class).to respond_to(:wc) expect{ described_class.wc(test_file) }.not_to raise_error end example 'wc accepts specific optional arguments' do expect{ described_class.wc(test_file, 'bytes') }.not_to raise_error expect{ described_class.wc(test_file, 'chars') }.not_to raise_error expect{ described_class.wc(test_file, 'words') }.not_to raise_error expect{ described_class.wc(test_file, 'lines') }.not_to raise_error end example 'argument to wc ignores the case of the option argument' do expect{ described_class.wc(test_file, 'LINES') }.not_to raise_error end example 'wc with no option returns expected results' do expect(described_class.wc(test_file)).to be_kind_of(Array) expect(described_class.wc(test_file)).to eq([166, 166, 25, 25]) end example 'wc with bytes option returns the expected result' do expect(described_class.wc(test_file, 'bytes')).to eq(166) end example 'wc with chars option returns the expected result' do expect(described_class.wc(test_file, 'chars')).to eq(166) end example 'wc with words option returns the expected result' do expect(described_class.wc(test_file, 'words')).to eq(25) end example 'wc with lines option returns the expected result' do expect(described_class.wc(test_file, 'lines')).to eq(25) end example 'wc requires at least on argument' do expect{ described_class.wc }.to raise_error(ArgumentError) end example 'an invalid option raises an error' do expect{ described_class.wc(test_file, 'bogus') }.to raise_error(ArgumentError) end end