Merge branch 'issue-20-sample-values' into 'master'

Fix nested sample_value blocks

Closes #20

See merge request arctic-fox/spectator!15
This commit is contained in:
Mike Miller 2019-08-17 14:26:15 +00:00
commit 9a3efb95f3
5 changed files with 93 additions and 52 deletions

View file

@ -1,5 +1,5 @@
name: spectator name: spectator
version: 0.8.0 version: 0.8.1
description: | description: |
A feature-rich spec testing framework for Crystal with similarities to RSpec. A feature-rich spec testing framework for Crystal with similarities to RSpec.

View file

@ -1,10 +1,21 @@
require "../spec_helper" require "../spec_helper"
SAMPLE_VALUES_COLLECTION = %i[foo bar baz]
struct SampleValueCollection
def initialize(sample_values : ::Spectator::Internals::SampleValues)
end
def create
SAMPLE_VALUES_COLLECTION
end
end
describe Spectator::DSL::SampleExampleGroupBuilder do describe Spectator::DSL::SampleExampleGroupBuilder do
describe "#add_child" do describe "#add_child" do
it "creates the correct number of children" do it "creates the correct number of children" do
collection = %i[foo bar baz] create_proc = ->(s : SampleValueCollection) { s.create }
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", collection, "value", :foo) builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", SampleValueCollection, create_proc, "value", :foo)
count = 4 count = 4
count.times do count.times do
factory = Spectator::DSL::ExampleFactory.new(PassingExample) factory = Spectator::DSL::ExampleFactory.new(PassingExample)
@ -15,13 +26,13 @@ describe Spectator::DSL::SampleExampleGroupBuilder do
root = Spectator::DSL::RootExampleGroupBuilder.new.build(Spectator::Internals::SampleValues.empty) root = Spectator::DSL::RootExampleGroupBuilder.new.build(Spectator::Internals::SampleValues.empty)
group = builder.build(root, Spectator::Internals::SampleValues.empty) group = builder.build(root, Spectator::Internals::SampleValues.empty)
all_children = group.map { |child| child.as(Spectator::ExampleGroup).to_a }.flatten all_children = group.map { |child| child.as(Spectator::ExampleGroup).to_a }.flatten
all_children.size.should eq(2 * count * collection.size) all_children.size.should eq(2 * count * SAMPLE_VALUES_COLLECTION.size)
end end
context "with an ExampleFactory" do context "with an ExampleFactory" do
it "creates an example for each item in the collection" do it "creates an example for each item in the collection" do
collection = %i[foo bar baz] create_proc = ->(s : SampleValueCollection) { s.create }
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", collection, "value", :foo) builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", SampleValueCollection, create_proc, "value", :foo)
factory = Spectator::DSL::ExampleFactory.new(PassingExample) factory = Spectator::DSL::ExampleFactory.new(PassingExample)
builder.add_child(factory) builder.add_child(factory)
root = Spectator::DSL::RootExampleGroupBuilder.new.build(Spectator::Internals::SampleValues.empty) root = Spectator::DSL::RootExampleGroupBuilder.new.build(Spectator::Internals::SampleValues.empty)
@ -33,8 +44,8 @@ describe Spectator::DSL::SampleExampleGroupBuilder do
context "with an ExampleGroupBuilder" do context "with an ExampleGroupBuilder" do
it "creates a group for each item in the collection" do it "creates a group for each item in the collection" do
collection = %i[foo bar baz] create_proc = ->(s : SampleValueCollection) { s.create }
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", collection, "value", :foo) builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", SampleValueCollection, create_proc, "value", :foo)
group_builder = Spectator::DSL::NestedExampleGroupBuilder.new("bar") group_builder = Spectator::DSL::NestedExampleGroupBuilder.new("bar")
builder.add_child(group_builder) builder.add_child(group_builder)
root = Spectator::DSL::RootExampleGroupBuilder.new.build(Spectator::Internals::SampleValues.empty) root = Spectator::DSL::RootExampleGroupBuilder.new.build(Spectator::Internals::SampleValues.empty)
@ -48,7 +59,8 @@ describe Spectator::DSL::SampleExampleGroupBuilder do
describe "#add_before_all_hook" do describe "#add_before_all_hook" do
it "adds a hook" do it "adds a hook" do
hook_called = false hook_called = false
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", %i[foo bar], "value", :foo) create_proc = ->(s : SampleValueCollection) { s.create }
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", SampleValueCollection, create_proc, "value", :foo)
builder.add_before_all_hook(->{ builder.add_before_all_hook(->{
hook_called = true hook_called = true
}) })
@ -60,7 +72,8 @@ describe Spectator::DSL::SampleExampleGroupBuilder do
it "attachs the hook to just the top-level group" do it "attachs the hook to just the top-level group" do
call_count = 0 call_count = 0
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", %i[foo bar], "value", :foo) create_proc = ->(s : SampleValueCollection) { s.create }
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", SampleValueCollection, create_proc, "value", :foo)
builder.add_before_all_hook(->{ builder.add_before_all_hook(->{
call_count += 1 call_count += 1
}) })
@ -72,7 +85,8 @@ describe Spectator::DSL::SampleExampleGroupBuilder do
it "supports multiple hooks" do it "supports multiple hooks" do
call_count = 0 call_count = 0
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", %i[foo bar], "value", :foo) create_proc = ->(s : SampleValueCollection) { s.create }
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", SampleValueCollection, create_proc, "value", :foo)
5.times do |i| 5.times do |i|
builder.add_before_all_hook(->{ builder.add_before_all_hook(->{
call_count += i + 1 call_count += i + 1
@ -88,7 +102,8 @@ describe Spectator::DSL::SampleExampleGroupBuilder do
describe "#add_before_each_hook" do describe "#add_before_each_hook" do
it "adds a hook" do it "adds a hook" do
hook_called = false hook_called = false
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", %i[foo bar], "value", :foo) create_proc = ->(s : SampleValueCollection) { s.create }
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", SampleValueCollection, create_proc, "value", :foo)
builder.add_before_each_hook(->{ builder.add_before_each_hook(->{
hook_called = true hook_called = true
}) })
@ -100,20 +115,21 @@ describe Spectator::DSL::SampleExampleGroupBuilder do
it "attachs the hook to just the top-level group" do it "attachs the hook to just the top-level group" do
call_count = 0 call_count = 0
collection = %i[foo bar] create_proc = ->(s : SampleValueCollection) { s.create }
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", collection, "value", :foo) builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", SampleValueCollection, create_proc, "value", :foo)
builder.add_before_each_hook(->{ builder.add_before_each_hook(->{
call_count += 1 call_count += 1
}) })
root = Spectator::DSL::RootExampleGroupBuilder.new.build(Spectator::Internals::SampleValues.empty) root = Spectator::DSL::RootExampleGroupBuilder.new.build(Spectator::Internals::SampleValues.empty)
group = builder.build(root, Spectator::Internals::SampleValues.empty) group = builder.build(root, Spectator::Internals::SampleValues.empty)
group.children.map(&.as(Spectator::ExampleGroup)).each(&.run_before_hooks) group.children.map(&.as(Spectator::ExampleGroup)).each(&.run_before_hooks)
call_count.should eq(collection.size) call_count.should eq(SAMPLE_VALUES_COLLECTION.size)
end end
it "supports multiple hooks" do it "supports multiple hooks" do
call_count = 0 call_count = 0
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", %i[foo bar], "value", :foo) create_proc = ->(s : SampleValueCollection) { s.create }
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", SampleValueCollection, create_proc, "value", :foo)
5.times do |i| 5.times do |i|
builder.add_before_each_hook(->{ builder.add_before_each_hook(->{
call_count += i + 1 call_count += i + 1
@ -129,7 +145,8 @@ describe Spectator::DSL::SampleExampleGroupBuilder do
describe "#add_after_all_hook" do describe "#add_after_all_hook" do
it "adds a hook" do it "adds a hook" do
hook_called = false hook_called = false
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", %i[foo bar], "value", :foo) create_proc = ->(s : SampleValueCollection) { s.create }
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", SampleValueCollection, create_proc, "value", :foo)
builder.add_after_all_hook(->{ builder.add_after_all_hook(->{
hook_called = true hook_called = true
}) })
@ -141,7 +158,8 @@ describe Spectator::DSL::SampleExampleGroupBuilder do
it "attachs the hook to just the top-level group" do it "attachs the hook to just the top-level group" do
call_count = 0 call_count = 0
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", %i[foo bar], "value", :foo) create_proc = ->(s : SampleValueCollection) { s.create }
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", SampleValueCollection, create_proc, "value", :foo)
builder.add_after_all_hook(->{ builder.add_after_all_hook(->{
call_count += 1 call_count += 1
}) })
@ -153,7 +171,8 @@ describe Spectator::DSL::SampleExampleGroupBuilder do
it "supports multiple hooks" do it "supports multiple hooks" do
call_count = 0 call_count = 0
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", %i[foo bar], "value", :foo) create_proc = ->(s : SampleValueCollection) { s.create }
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", SampleValueCollection, create_proc, "value", :foo)
5.times do |i| 5.times do |i|
builder.add_after_all_hook(->{ builder.add_after_all_hook(->{
call_count += i + 1 call_count += i + 1
@ -169,7 +188,8 @@ describe Spectator::DSL::SampleExampleGroupBuilder do
describe "#add_after_each_hook" do describe "#add_after_each_hook" do
it "adds a hook" do it "adds a hook" do
hook_called = false hook_called = false
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", %i[foo bar], "value", :foo) create_proc = ->(s : SampleValueCollection) { s.create }
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", SampleValueCollection, create_proc, "value", :foo)
builder.add_after_each_hook(->{ builder.add_after_each_hook(->{
hook_called = true hook_called = true
}) })
@ -181,20 +201,21 @@ describe Spectator::DSL::SampleExampleGroupBuilder do
it "attachs the hook to just the top-level group" do it "attachs the hook to just the top-level group" do
call_count = 0 call_count = 0
collection = %i[foo bar] create_proc = ->(s : SampleValueCollection) { s.create }
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", collection, "value", :foo) builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", SampleValueCollection, create_proc, "value", :foo)
builder.add_after_each_hook(->{ builder.add_after_each_hook(->{
call_count += 1 call_count += 1
}) })
root = Spectator::DSL::RootExampleGroupBuilder.new.build(Spectator::Internals::SampleValues.empty) root = Spectator::DSL::RootExampleGroupBuilder.new.build(Spectator::Internals::SampleValues.empty)
group = builder.build(root, Spectator::Internals::SampleValues.empty) group = builder.build(root, Spectator::Internals::SampleValues.empty)
group.children.map(&.as(Spectator::ExampleGroup)).each(&.run_after_hooks) group.children.map(&.as(Spectator::ExampleGroup)).each(&.run_after_hooks)
call_count.should eq(collection.size) call_count.should eq(SAMPLE_VALUES_COLLECTION.size)
end end
it "supports multiple hooks" do it "supports multiple hooks" do
call_count = 0 call_count = 0
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", %i[foo bar], "value", :foo) create_proc = ->(s : SampleValueCollection) { s.create }
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", SampleValueCollection, create_proc, "value", :foo)
5.times do |i| 5.times do |i|
builder.add_after_each_hook(->{ builder.add_after_each_hook(->{
call_count += i + 1 call_count += i + 1
@ -210,7 +231,8 @@ describe Spectator::DSL::SampleExampleGroupBuilder do
describe "#build" do describe "#build" do
it "passes along the what value" do it "passes along the what value" do
what = "TEST" what = "TEST"
builder = Spectator::DSL::SampleExampleGroupBuilder.new(what, %i[foo bar], "value", :foo) create_proc = ->(s : SampleValueCollection) { s.create }
builder = Spectator::DSL::SampleExampleGroupBuilder.new(what, SampleValueCollection, create_proc, "value", :foo)
root = Spectator::DSL::RootExampleGroupBuilder.new.build(Spectator::Internals::SampleValues.empty) root = Spectator::DSL::RootExampleGroupBuilder.new.build(Spectator::Internals::SampleValues.empty)
group = builder.build(root, Spectator::Internals::SampleValues.empty) group = builder.build(root, Spectator::Internals::SampleValues.empty)
group.what.should eq(what) group.what.should eq(what)
@ -218,7 +240,8 @@ describe Spectator::DSL::SampleExampleGroupBuilder do
it "passes along the parent" do it "passes along the parent" do
factory = Spectator::DSL::ExampleFactory.new(SpyExample) factory = Spectator::DSL::ExampleFactory.new(SpyExample)
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", %i[foo bar], "value", :foo) create_proc = ->(s : SampleValueCollection) { s.create }
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", SampleValueCollection, create_proc, "value", :foo)
builder.add_child(factory) builder.add_child(factory)
root = Spectator::DSL::RootExampleGroupBuilder.new.build(Spectator::Internals::SampleValues.empty) root = Spectator::DSL::RootExampleGroupBuilder.new.build(Spectator::Internals::SampleValues.empty)
group = builder.build(root, Spectator::Internals::SampleValues.empty) group = builder.build(root, Spectator::Internals::SampleValues.empty)
@ -227,7 +250,8 @@ describe Spectator::DSL::SampleExampleGroupBuilder do
it "passes along the sample values" do it "passes along the sample values" do
factory = Spectator::DSL::ExampleFactory.new(SpyExample) factory = Spectator::DSL::ExampleFactory.new(SpyExample)
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", %i[foo bar], "value", :foo) create_proc = ->(s : SampleValueCollection) { s.create }
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", SampleValueCollection, create_proc, "value", :foo)
builder.add_child(factory) builder.add_child(factory)
symbol = :test symbol = :test
values = Spectator::Internals::SampleValues.empty.add(symbol, "foo", 12345) values = Spectator::Internals::SampleValues.empty.add(symbol, "foo", 12345)
@ -241,7 +265,8 @@ describe Spectator::DSL::SampleExampleGroupBuilder do
symbol = :foo symbol = :foo
name = "value" name = "value"
factory = Spectator::DSL::ExampleFactory.new(SpyExample) factory = Spectator::DSL::ExampleFactory.new(SpyExample)
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", %i[foo bar], name, symbol) create_proc = ->(s : SampleValueCollection) { s.create }
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", SampleValueCollection, create_proc, name, symbol)
builder.add_child(factory) builder.add_child(factory)
root = Spectator::DSL::RootExampleGroupBuilder.new.build(Spectator::Internals::SampleValues.empty) root = Spectator::DSL::RootExampleGroupBuilder.new.build(Spectator::Internals::SampleValues.empty)
group = builder.build(root, Spectator::Internals::SampleValues.empty) group = builder.build(root, Spectator::Internals::SampleValues.empty)
@ -253,31 +278,32 @@ describe Spectator::DSL::SampleExampleGroupBuilder do
end end
it "creates the correct number of sub-groups" do it "creates the correct number of sub-groups" do
collection = %i[foo bar baz] create_proc = ->(s : SampleValueCollection) { s.create }
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", collection, "value", :foo) builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", SampleValueCollection, create_proc, "value", :foo)
factory = Spectator::DSL::ExampleFactory.new(PassingExample) factory = Spectator::DSL::ExampleFactory.new(PassingExample)
builder.add_child(factory) builder.add_child(factory)
root = Spectator::DSL::RootExampleGroupBuilder.new.build(Spectator::Internals::SampleValues.empty) root = Spectator::DSL::RootExampleGroupBuilder.new.build(Spectator::Internals::SampleValues.empty)
group = builder.build(root, Spectator::Internals::SampleValues.empty) group = builder.build(root, Spectator::Internals::SampleValues.empty)
group.children.size.should eq(collection.size) group.children.size.should eq(SAMPLE_VALUES_COLLECTION.size)
end end
it "passes the correct value to each sub-group" do it "passes the correct value to each sub-group" do
factory = Spectator::DSL::ExampleFactory.new(SpyExample) factory = Spectator::DSL::ExampleFactory.new(SpyExample)
symbol = :test symbol = :test
count = 3 count = 3
collection = %i[foo bar baz] expected = Array.new(SAMPLE_VALUES_COLLECTION.size * count) { |i| SAMPLE_VALUES_COLLECTION[i / count] }
expected = Array.new(collection.size * count) { |i| collection[i / count] } create_proc = ->(s : SampleValueCollection) { s.create }
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", collection, "value", symbol) builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", SampleValueCollection, create_proc, "value", symbol)
count.times { builder.add_child(factory) } count.times { builder.add_child(factory) }
root = Spectator::DSL::RootExampleGroupBuilder.new.build(Spectator::Internals::SampleValues.empty) root = Spectator::DSL::RootExampleGroupBuilder.new.build(Spectator::Internals::SampleValues.empty)
group = builder.build(root, Spectator::Internals::SampleValues.empty) group = builder.build(root, Spectator::Internals::SampleValues.empty)
all_children = group.map { |child| child.as(Spectator::ExampleGroup).to_a }.flatten all_children = group.map { |child| child.as(Spectator::ExampleGroup).to_a }.flatten
all_children.map { |child| child.as(SpyExample).sample_values.get_value(symbol, typeof(collection.first)) }.should eq(expected) all_children.map { |child| child.as(SpyExample).sample_values.get_value(symbol, typeof(SAMPLE_VALUES_COLLECTION.first)) }.should eq(expected)
end end
it "specifies the parent of the children correctly" do it "specifies the parent of the children correctly" do
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", %i[foo bar], "value", :foo) create_proc = ->(s : SampleValueCollection) { s.create }
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", SampleValueCollection, create_proc, "value", :foo)
3.times do 3.times do
factory = Spectator::DSL::ExampleFactory.new(PassingExample) factory = Spectator::DSL::ExampleFactory.new(PassingExample)
group_builder = Spectator::DSL::NestedExampleGroupBuilder.new("baz") group_builder = Spectator::DSL::NestedExampleGroupBuilder.new("baz")
@ -299,7 +325,8 @@ describe Spectator::DSL::SampleExampleGroupBuilder do
end end
it "specifies the container for the parent of the sub-groups" do it "specifies the container for the parent of the sub-groups" do
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", %i[foo bar], "value", :foo) create_proc = ->(s : SampleValueCollection) { s.create }
builder = Spectator::DSL::SampleExampleGroupBuilder.new("foobar", SampleValueCollection, create_proc, "value", :foo)
3.times do 3.times do
factory = Spectator::DSL::ExampleFactory.new(PassingExample) factory = Spectator::DSL::ExampleFactory.new(PassingExample)
group_builder = Spectator::DSL::NestedExampleGroupBuilder.new("baz") group_builder = Spectator::DSL::NestedExampleGroupBuilder.new("baz")

View file

@ -41,6 +41,12 @@ module Spectator
# Include the DSL for creating groups, example, and more. # Include the DSL for creating groups, example, and more.
include ::Spectator::DSL::StructureDSL include ::Spectator::DSL::StructureDSL
# Placeholder initializer.
# This is needed because examples and groups call super in their initializer.
# Those initializers pass the sample values upward through their hierarchy.
def initialize(_sample_values : ::Spectator::Internals::SampleValues)
end
# Pass off the "what" argument and block to `DSL::StructureDSL.describe`. # Pass off the "what" argument and block to `DSL::StructureDSL.describe`.
# That method will handle creating a new group for this spec. # That method will handle creating a new group for this spec.
describe({{what}}) {{block}} describe({{what}}) {{block}}

View file

@ -2,14 +2,17 @@ require "./nested_example_group_builder"
module Spectator::DSL module Spectator::DSL
# Specialized example group builder for "sample" groups. # Specialized example group builder for "sample" groups.
# The type parameter `C` is the type to instantiate to create the collection.
# The type parameter `T` should be the type of each element in the sample collection. # The type parameter `T` should be the type of each element in the sample collection.
# This builder creates a container group with groups inside for each item in the collection. # This builder creates a container group with groups inside for each item in the collection.
# The hooks are only defined for the container group. # The hooks are only defined for the container group.
# By doing so, the hooks are defined once, are inherited, and use less memory. # By doing so, the hooks are defined once, are inherited, and use less memory.
class SampleExampleGroupBuilder(T) < NestedExampleGroupBuilder class SampleExampleGroupBuilder(C, T) < NestedExampleGroupBuilder
# Creates a new group builder. # Creates a new group builder.
# The value for *what* should be the text the user specified for the collection. # The value for *what* should be the text the user specified for the collection.
# The *collection* is the actual array of items to create examples for. # The *collection_type* is the type to create that will produce the items.
# The *collection_builder* is a proc that takes an instance of *collection_type*
# and returns an actual array of items to create examples for.
# The *name* is the variable name that the user accesses the current collection item with. # The *name* is the variable name that the user accesses the current collection item with.
# #
# In this code: # In this code:
@ -25,7 +28,8 @@ module Spectator::DSL
# The *symbol* is passed along to the sample values # The *symbol* is passed along to the sample values
# so that the example code can retrieve the current item from the collection. # so that the example code can retrieve the current item from the collection.
# The symbol should be unique. # The symbol should be unique.
def initialize(what : String, @collection : Array(T), @name : String, @symbol : Symbol) def initialize(what : String, @collection_type : C.class, @collection_builder : C -> Array(T),
@name : String, @symbol : Symbol)
super(what) super(what)
end end
@ -35,11 +39,13 @@ module Spectator::DSL
# The *parent* should be the group that contains this group. # The *parent* should be the group that contains this group.
# The *sample_values* will be given to all of the examples (and groups) nested in this group. # The *sample_values* will be given to all of the examples (and groups) nested in this group.
def build(parent : ExampleGroup, sample_values : Internals::SampleValues) : NestedExampleGroup def build(parent : ExampleGroup, sample_values : Internals::SampleValues) : NestedExampleGroup
collection = @collection_builder.call(@collection_type.new(sample_values))
# This creates the container for the sub-groups. # This creates the container for the sub-groups.
# The hooks are defined here, instead of repeating for each sub-group. # The hooks are defined here, instead of repeating for each sub-group.
NestedExampleGroup.new(@what, parent, hooks, conditions).tap do |group| NestedExampleGroup.new(@what, parent, hooks, conditions).tap do |group|
# Set the container group's children to be sub-groups for each item in the collection. # Set the container group's children to be sub-groups for each item in the collection.
group.children = @collection.map do |value| group.children = collection.map do |value|
# Create a sub-group for each item in the collection. # Create a sub-group for each item in the collection.
build_sub_group(group, sample_values, value).as(ExampleComponent) build_sub_group(group, sample_values, value).as(ExampleComponent)
end end

View file

@ -151,12 +151,6 @@ module Spectator::DSL
# Sample values are a collection of test values that can be used in examples. # Sample values are a collection of test values that can be used in examples.
# For more information, see `Internals::SampleValues`. # For more information, see `Internals::SampleValues`.
module StructureDSL module StructureDSL
# Placeholder initializer.
# This is needed because examples and groups call super in their initializer.
# Those initializers pass the sample values upward through their hierarchy.
def initialize(sample_values : Internals::SampleValues)
end
# Creates a new example group to describe a component. # Creates a new example group to describe a component.
# The *what* argument describes "what" is being tested. # The *what* argument describes "what" is being tested.
# Additional example groups and DSL may be nested in the block. # Additional example groups and DSL may be nested in the block.
@ -517,6 +511,13 @@ module Spectator::DSL
# Include the parent module. # Include the parent module.
include {{@type.id}} include {{@type.id}}
# Placeholder initializer.
# This is needed because examples and groups call super in their initializer.
# Those initializers pass the sample values upward through their hierarchy.
def initialize(_sample_values : ::Spectator::Internals::SampleValues)
super
end
# Method that returns an array containing the collection. # Method that returns an array containing the collection.
# This method should be called only once. # This method should be called only once.
# The framework stores the collection as an array for a couple of reasons. # The framework stores the collection as an array for a couple of reasons.
@ -564,7 +565,8 @@ module Spectator::DSL
# Sample groups require additional configuration. # Sample groups require additional configuration.
::Spectator::DSL::Builder.start_sample_group( ::Spectator::DSL::Builder.start_sample_group(
{{collection.stringify}}, # String representation of the collection. {{collection.stringify}}, # String representation of the collection.
Sample%sample.new.%to_a, # All elements in the collection. Sample%sample, # Type that can construct the elements.
->(s : Sample%sample) { s.%to_a }, # Proc to build the array of elements in the collection.
{{name.stringify}}, # Name for the current element. {{name.stringify}}, # Name for the current element.
:%sample # Unique identifier for retrieving elements for the associated collection. :%sample # Unique identifier for retrieving elements for the associated collection.
) )
@ -684,7 +686,7 @@ module Spectator::DSL
# Sample groups require additional configuration. # Sample groups require additional configuration.
::Spectator::DSL::Builder.start_sample_group( ::Spectator::DSL::Builder.start_sample_group(
{{collection.stringify}}, # String representation of the collection. {{collection.stringify}}, # String representation of the collection.
Sample%sample.new.%to_a, # All elements in the collection. Sample%sample, # All elements in the collection.
{{name.stringify}}, # Name for the current element. {{name.stringify}}, # Name for the current element.
:%sample # Unique identifier for retrieving elements for the associated collection. :%sample # Unique identifier for retrieving elements for the associated collection.
) )