1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
class GenericExample
Contract C::Args[String], C::KeywordArgs[ repeat: C::Maybe[C::Num] ] => C::ArrayOf[String]
def splat_then_optional_named(*vals, repeat: 2)
vals.map { |v| v * repeat }
end
Contract C::KeywordArgs[ foo: C::Nat ] => nil
def nat_test_with_kwarg(foo: 10)
end
Contract C::KeywordArgs[name: C::Optional[String]], C::Func[String => String] => String
def keyword_args_hello(name: "Adit", &block)
"Hey, #{yield name}!"
end
end
RSpec.describe "Contracts:" do
before :all do
@o = GenericExample.new
end
describe "Optional named arguments" do
it "should work with optional named argument unfilled after splat" do
expect { @o.splat_then_optional_named("hello", "world") }.to_not raise_error
end
it "should work with optional named argument filled after splat" do
expect { @o.splat_then_optional_named("hello", "world", repeat: 3) }.to_not raise_error
end
end
describe "Nat:" do
it "should pass for keyword args with correct arg given" do
expect { @o.nat_test_with_kwarg(foo: 10) }.to_not raise_error
end
it "should fail with a ContractError for wrong keyword args input" do
expect { @o.nat_test_with_kwarg(foo: -10) }.to raise_error(ContractError)
end
it "should fail with a ContractError for no input" do
expect { @o.nat_test_with_kwarg }.to raise_error(ContractError)
end
end
describe "keyword args with defaults, with a block" do
it "should work when both keyword args and a block is given" do
expect(@o.keyword_args_hello(name: "maggie", &:upcase)).to eq("Hey, MAGGIE!")
end
it "should work even when keyword args aren't given" do
expect(@o.keyword_args_hello(&:upcase)).to eq("Hey, ADIT!")
end
end
end
|