diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..32c9c3e --- /dev/null +++ b/Gemfile @@ -0,0 +1,4 @@ +# A sample Gemfile +source "https://rubygems.org" + +gem "rspec" diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..a8657ed --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,26 @@ +GEM + remote: https://rubygems.org/ + specs: + diff-lcs (1.3) + rspec (3.6.0) + rspec-core (~> 3.6.0) + rspec-expectations (~> 3.6.0) + rspec-mocks (~> 3.6.0) + rspec-core (3.6.0) + rspec-support (~> 3.6.0) + rspec-expectations (3.6.0) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.6.0) + rspec-mocks (3.6.0) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.6.0) + rspec-support (3.6.0) + +PLATFORMS + ruby + +DEPENDENCIES + rspec + +BUNDLED WITH + 1.15.1 diff --git a/lib/ruby-dev-challenge/challenge_1.md b/lib/ruby-dev-challenge/challenge_1.md new file mode 100644 index 0000000..8952454 --- /dev/null +++ b/lib/ruby-dev-challenge/challenge_1.md @@ -0,0 +1,14 @@ +# Desafio 1 + +> O que esta expressão retorna e por quê? +> +> `true and 0 && !nil and 3 > 2` + +A expressão acima retorna `true`, pois é uma sequência de `and`s onde todos os valores são avaliados para `true`. +Simplificando a expressão: + +```ruby +true and true && true and true +``` + +Neste caso, `and` e `&&` podem ser tratados como equivalentes. O que leva ao resultado `true`. diff --git a/lib/ruby-dev-challenge/challenge_2.md b/lib/ruby-dev-challenge/challenge_2.md new file mode 100644 index 0000000..c0844ec --- /dev/null +++ b/lib/ruby-dev-challenge/challenge_2.md @@ -0,0 +1,14 @@ +# Desafio 2 + +> Explique o funcionamento do operador _Or Equals_ +> +> `a ||= b` + +O operador _Or_Equals_, na expressão `a ||= b` faz com que ela seja equivalente à expressão `a || a = b`. +Isso é utilizado para tirar proveito de que o operador `||` é _lazy_. Sendo assim, caso _a_ seja logicamente verdadeiro, mantém o seu valor. Mas se _a_ é logicamente falso, recebe o valor da expressão do lado direito do operador. + +Um exemplo de uso do operador é garantir que uma variável tenha um valor sempre: + +```ruby +name ||= "Default Name" +``` diff --git a/lib/ruby-dev-challenge/challenge_3/dev_magic.rb b/lib/ruby-dev-challenge/challenge_3/dev_magic.rb new file mode 100644 index 0000000..5d7abd5 --- /dev/null +++ b/lib/ruby-dev-challenge/challenge_3/dev_magic.rb @@ -0,0 +1,22 @@ +class DevMagic + class << self + def print(number) + result = String.new + + result << "Dev" if dev?(number) + result << "Magic" if magic?(number) + result << number.to_s if result.empty? + result + end + + private + + def dev?(number) + number % 3 == 0 + end + + def magic?(number) + number % 5 == 0 + end + end +end diff --git a/lib/ruby-dev-challenge/challenge_3/script.rb b/lib/ruby-dev-challenge/challenge_3/script.rb new file mode 100644 index 0000000..db7a4cf --- /dev/null +++ b/lib/ruby-dev-challenge/challenge_3/script.rb @@ -0,0 +1,5 @@ +require 'dev_magic' + +(1..100).each do |n| + p DevMagic.print(n) +end diff --git a/lib/ruby-dev-challenge/challenge_4.rb b/lib/ruby-dev-challenge/challenge_4.rb new file mode 100644 index 0000000..60d4ef5 --- /dev/null +++ b/lib/ruby-dev-challenge/challenge_4.rb @@ -0,0 +1,9 @@ +module Extensions + module String + module Palindrome + def palindrome? + self == self.reverse + end + end + end +end diff --git a/lib/ruby-dev-challenge/challenge_5.rb b/lib/ruby-dev-challenge/challenge_5.rb new file mode 100644 index 0000000..417c7b9 --- /dev/null +++ b/lib/ruby-dev-challenge/challenge_5.rb @@ -0,0 +1,15 @@ +class IntegerConverter + class << self + def to_string(number) + validate(number) + + "#{ number }" + end + + private + + def validate(number) + raise ArgumentError unless number.is_a? Integer + end + end +end diff --git a/spec/challenge_3_spec.rb b/spec/challenge_3_spec.rb new file mode 100644 index 0000000..d8dffa2 --- /dev/null +++ b/spec/challenge_3_spec.rb @@ -0,0 +1,37 @@ +require './lib/ruby-dev-challenge/challenge_3/dev_magic' + +describe DevMagic do + subject { DevMagic.print(number) } + + context "regular number" do + let(:number) { [ 1, 2, 4, 7 ].sample } + + it "prints the number" do + is_expected.to eq number.to_s + end + end + + context "divisible by 3" do + let(:number) { [ 3, 6, 9, 12 ].sample } + + it "prints dev" do + is_expected.to eq "Dev" + end + end + + context "divisible by 5" do + let(:number) { [ 5, 10, 20, 25 ].sample } + + it "prints dev" do + is_expected.to eq "Magic" + end + end + + context "divisible by both" do + let(:number) { [ 15, 30, 45, 60 ].sample } + + it "prints dev" do + is_expected.to eq "DevMagic" + end + end +end diff --git a/spec/challenge_4_spec.rb b/spec/challenge_4_spec.rb new file mode 100644 index 0000000..a7fb091 --- /dev/null +++ b/spec/challenge_4_spec.rb @@ -0,0 +1,15 @@ +require './lib/ruby-dev-challenge/challenge_4' + +String.include Extensions::String::Palindrome + +describe "a" do + it { is_expected.to be_palindrome } +end + +describe "girafarig" do + it { is_expected.to be_palindrome } +end + +describe "devMagic" do + it { is_expected.not_to be_palindrome } +end diff --git a/spec/challenge_5_spec.rb b/spec/challenge_5_spec.rb new file mode 100644 index 0000000..9b0bbee --- /dev/null +++ b/spec/challenge_5_spec.rb @@ -0,0 +1,19 @@ +require './lib/ruby-dev-challenge/challenge_5' + +describe IntegerConverter do + subject(:convert) { IntegerConverter.to_string(number) } + + context "given a number" do + let(:number) { rand(100) } + + it { is_expected.to eq number.to_s } + end + + context "given an invalid input" do + let(:number) { nil } + + it "throws an exception" do + expect { convert }.to raise_error ArgumentError + end + end +end