You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

259 lines
6.5 KiB

# encoding: UTF-8
require 'spec_helper'
require 'squib/import/data_frame'
describe Squib::DataFrame do
let(:basic) do
{
'Name' => ['Mage', 'Rogue', 'Warrior'],
'Cost' => [1, 2, 3],
}
end
let(:uneven) do
{
'Name' => ['Mage', 'Rogue', 'Warrior'],
'Cost' => [1, 2],
}
end
let(:whitespace) do
{
'Name \n\r\t' => [' Mage \t\r\n'],
}
end
let(:defined) do
{
'nrows' => [1,2,3],
}
end
context 'is Enumerable and like a hash, so it' do
it 'responds to each' do
expect(subject).to respond_to(:each)
end
it 'responds to any?' do
expect(subject.any?).to be false
end
it 'responds to []' do
data = Squib::DataFrame.new basic
expect(data['Cost']).to eq([1, 2, 3])
end
it 'responds to []=' do
data = Squib::DataFrame.new basic
data[:a] = 2
expect(data[:a]).to eq(2)
end
end
context :columns do
it 'provides a list of columns' do
data = Squib::DataFrame.new basic
expect(data.columns).to eq %w(Name Cost)
end
end
context :ncolumns do
it 'provides column count' do
data = Squib::DataFrame.new basic
expect(data.ncolumns).to eq 2
end
end
context :row do
it 'returns a hash of each row' do
data = Squib::DataFrame.new basic
expect(data.row(0)).to eq ({'Name' => 'Mage', 'Cost' => 1})
expect(data.row(1)).to eq ({'Name' => 'Rogue', 'Cost' => 2})
end
it 'returns nil for uneven data' do
data = Squib::DataFrame.new uneven
expect(data.row(2)).to eq ({'Name' => 'Warrior', 'Cost' => nil})
end
end
context :nrows do
it 'returns a row count on even data' do
data = Squib::DataFrame.new basic
expect(data.nrows).to eq 3
end
it 'returns largest row count on uneven data' do
data = Squib::DataFrame.new basic
expect(data.nrows).to eq 3
end
end
context :json do
it 'returns quoty json' do
data = Squib::DataFrame.new basic
expect(data.to_json).to eq "{\"Name\":[\"Mage\",\"Rogue\",\"Warrior\"],\"Cost\":[1,2,3]}"
end
it 'returns pretty json' do
data = Squib::DataFrame.new basic
str = <<-EOS
{
"Name": [
"Mage",
"Rogue",
"Warrior"
],
"Cost": [
1,
2,
3
]
}
EOS
expect(data.to_pretty_json).to eq str.chomp
end
end
context :def_column do
it 'creates name for Name column' do
data = Squib::DataFrame.new basic
expect(data).to respond_to(:name)
expect(data.name).to eq %w(Mage Rogue Warrior)
expect(data.cost).to eq [1, 2, 3]
end
it 'does not redefine methods' do
data = Squib::DataFrame.new defined
expect(data).to respond_to(:nrows)
expect(data.nrows).to eq 3
end
it 'defines a new column from empty data frame' do
data = Squib::DataFrame.new
expect(data).not_to respond_to(:snark)
data['snark'] = [1,2,3]
expect(data.snark).to eq [1,2,3]
end
end
context :snake_case do
subject { Squib::DataFrame.new }
it 'strips leading & trailing whitespace' do
expect(subject.send(:snake_case, ' A ')).to eq :a
end
it 'converts space to _' do
expect(subject.send(:snake_case, 'A b')).to eq :a_b
end
it 'handles multiwhitespace' do
expect(subject.send(:snake_case, 'A b')).to eq :a_b
end
it 'handles camelcase' do
expect(subject.send(:snake_case, 'fooBar')).to eq :foo_bar
end
it 'handles camelcase with multiple capitals' do
expect(subject.send(:snake_case, 'FOOBar')).to eq :foo_bar
end
end
context :col? do
it 'returns true if a column exists' do
data = Squib::DataFrame.new basic
expect(data.col? 'Name').to be true
end
it 'returns false if a column does not exist' do
data = Squib::DataFrame.new basic
expect(data.col? 'ROUS').to be false
end
end
context :wrap_n_pad do
subject { Squib::DataFrame.new basic }
it 'returns a handles a single line' do
expect(subject.send(:wrap_n_pad, 'a', 3)).
to eq "| a |\n"
end
it 'wraps multiple a lines at 34 characters' do
expect(subject.send(:wrap_n_pad, 'a' * 40, 3)).
to eq <<-EOS
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
| aaaaaa |
EOS
end
end
context :to_pretty_text do
let(:verbose) do
{
'Name' => ['Mage', 'Rogue', 'Warrior'],
'Cost' => [1, 2, 3],
'Description' => [
'Magic, dude.',
'I like to be sneaky',
'I have a long story to tell to test the word-wrapping ability of pretty text formatting.'
],
'Snark' => [nil, '', ' ']
}
end
it 'returns fun ascii art of the card' do
data = Squib::DataFrame.new verbose
expect(data.to_pretty_text).to eq <<-EOS
------------------------------------
Name | Mage |
Cost | 1 |
Description | Magic, dude. |
Snark | |
------------------------------------
------------------------------------
Name | Rogue |
Cost | 2 |
Description | I like to be sneaky |
Snark | |
------------------------------------
------------------------------------
Name | Warrior |
Cost | 3 |
Description | I have a long story to tell to tes |
| t the word-wrapping ability of pre |
| tty text formatting. |
Snark | |
------------------------------------
EOS
end
let(:utf8_fun) do
{
'Fun with UTF8!' => ['👊'],
}
end
it 'is admittedly janky with multibyte chars' do
# I hate how Ruby handles multibyte chars. Blech!
data = Squib::DataFrame.new utf8_fun
expect(data.to_pretty_text).to eq <<-EOS
------------------------------------
Fun with UTF8! | 👊 |
------------------------------------
EOS
end
it 'does not pad the data' do
data = Squib::DataFrame.new
data['a'] = ['b', 'c']
expect(data.to_pretty_text.size).to be > 0
expect(data.columns).to eq ['a']
expect(data['a']).to eq ['b', 'c']
end
end
end