Skip to content

Instantly share code, notes, and snippets.

@ngocbv
Last active November 11, 2018 02:54
Show Gist options
  • Select an option

  • Save ngocbv/58c5645a1c47e92117d78d78103a85dc to your computer and use it in GitHub Desktop.

Select an option

Save ngocbv/58c5645a1c47e92117d78d78103a85dc to your computer and use it in GitHub Desktop.
class CustomSet
attr_reader :data
def initialize(init_data)
@data = init_data
end
def exist?(element)
@data.each do |record|
if element == record
return true
end
end
false
end
def add(element)
@data << element unless exist?(element)
end
def remove(element)
@data.delete(element)
end
end
require 'rails_helper'
RSpec.describe 'CustomSet' do
let(:set) { CustomSet.new(init_data) }
describe '#exist?' do
subject { set.exist?(element) }
context 'set already have data' do
let(:init_data) { [1, 2] }
context 'element exists in set' do
let(:element) { 1 }
it { is_expected.to eq true }
end
context 'element does not exist in set' do
let(:element) { 3 }
it { is_expected.to eq false }
end
end
context 'set does not have data' do
let(:init_data) { [] }
let(:element) { 1 }
it { is_expected.to eq false }
end
end
describe '#add' do
let(:init_data) { [1, 2] }
after do
expect(set.exist?(element)).to eq true
end
context 'added element exists in set' do
let(:element) { 1 }
it 'does not add to set' do
expect { set.add(element) }.not_to change { set.data.length }
end
end
context 'added element does not exists in set' do
let(:element) { 3 }
it 'adds element to set' do
expect { set.add(element) }.to change { set.data.length }.by(1)
end
end
end
describe '#remove' do
subject(:remove_element) { set.remove(element) }
let(:init_data) { [1, 2] }
after do
expect(set.exist?(element)).to eq false
end
context 'removed element exists in set' do
let(:element) { 1 }
it 'removes element from set' do
expect { remove_element }.to change { set.data.length }.by(-1)
expect(remove_element).to eq element
end
end
context 'removed element does not exists in set' do
let(:element) { 3 }
it 'does not remove element from set' do
expect { set.remove(element) }.not_to change { set.data.length }
expect(remove_element).to be_nil
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment