summaryrefslogtreecommitdiffhomepage
path: root/spec/entity_manager_spec.rb
blob: 206898633cbe0777962bcc3bb7c7256250aaa1f6 (plain)
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# frozen_string_literal: true

require_relative '../lib/felflame'

# class EntitiesTest < Minitest::Test

describe 'Entities' do
  before :all do
    $VERBOSE = nil
    @component_manager ||= FelFlame::Components.new('TestEntity', :param1, param2: 'def')
  end

  before :each do
    @orig_stderr = $stderr
    $stderr = StringIO.new
    @ent0 = FelFlame::Entities.new
    @ent1 = FelFlame::Entities.new
    @ent2 = FelFlame::Entities.new
    @cmp0 = @component_manager.new
    @cmp1 = @component_manager.new
    @cmp2 = @component_manager.new
  end

  after :each do
    $stderr = @orig_stderr
    FelFlame::Entities.reverse_each(&:delete)
    @component_manager.reverse_each(&:delete)
  end

  it 'can get a single component' do
    expect { @ent0.component[@component_manager] }.to raise_error(RuntimeError)
    @ent0.add @cmp0
    expect(@ent0.component[@component_manager]).to eq(@cmp0)
    expect(@ent0.component[@component_manager]).to eq(@ent0.component(@component_manager))
    @ent0.add @cmp1
    @ent0.component[@component_manager]
    $stderr.rewind
    $stderr.string.chomp.should eq("This entity has MANY of this component but you called the method that is intended for having a single of this component type.\nYou may have a bug in your logic.")
    @ent0.components[@component_manager].reverse_each do |component|
      @ent0.remove component
    end
    expect { @ent0.component[@component_manager] }.to raise_error(RuntimeError)
  end

  it 'responds to array methods' do
    expect(FelFlame::Entities.respond_to?(:[])).to be true
    expect(FelFlame::Entities.respond_to?(:each)).to be true
    FelFlame::Entities.each do |entity|
      expect(entity.respond_to?(:components)).to be true
    end
    expect(FelFlame::Entities.respond_to?(:filter)).to be true
    expect(FelFlame::Entities.respond_to?(:first)).to be true
    expect(FelFlame::Entities.respond_to?(:last)).to be true
    expect(FelFlame::Entities.respond_to?(:somethingwrong)).to be false
  end

  it 'dont respond to missing methods' do
    expect { FelFlame::Entities.somethingwrong }.to raise_error(NoMethodError)
  end

  it 'won\'t add duplicate entities' do
    @ent0.add @cmp0, @cmp0, @cmp1, @cmp1
    expect(@ent0.components[@component_manager].count).to eq(2)
  end

  it 'can be accessed' do
    expect(FelFlame::Entities[0].respond_to?(:components)).to eq(true)
    expect(FelFlame::Entities[1].respond_to?(:components)).to eq(true)
    expect(FelFlame::Entities[2].respond_to?(:components)).to eq(true)
  end

  it 'can have components attached' do
    @ent0.add @cmp0
    expect(@ent0.component[@component_manager]).to eq(@cmp0)

    @ent1.add @cmp1, @cmp2
    expect(@ent1.components[@component_manager].length).to eq(2)
    expect(@ent1.components[@component_manager].include?(@cmp1)).to be true
    expect(@ent1.components[@component_manager].include?(@cmp2)).to be true
  end

  it 'can have components removed' do
    @ent0.add @cmp0
    expect(@ent0.remove(@cmp0)).to be true
    expect(@cmp0.entities.empty?).to be true
    expect(@ent0.components[@component_manager].nil?).to be true
    @ent0.add @cmp0
    @cmp0.delete
    expect(@ent0.components[@component_manager].nil?).to be true
  end

  it 'can have many components added then removed' do
    @ent0.add @cmp0, @cmp1, @cmp2
    @ent1.add @cmp0, @cmp1
    @ent2.add @cmp1, @cmp2
    expect(@ent0.components).to eq({ @component_manager => [@cmp0, @cmp1, @cmp2] })
    expect(@cmp0.entities).to eq([@ent0, @ent1])
    expect(@cmp1.entities).to eq([@ent0, @ent1, @ent2])
    expect(@cmp2.entities).to eq([@ent0, @ent2])
    @ent1.delete
    expect(@cmp0.entities).to eq([@ent0])
    expect(@cmp1.entities).to eq([@ent0, @ent2])
    expect(@cmp2.entities).to eq([@ent0, @ent2])
    @cmp1.delete
    expect(@ent0.components).to eq({ @component_manager => [@cmp0, @cmp2] })
    @component_manager.reverse_each(&:delete)
    expect(@component_manager.length).to eq(0)
    expect(@component_manager.empty?).to be true
    expect(@ent0.components).to eq({})
    expect(@ent2.components).to eq({})
    FelFlame::Entities.reverse_each(&:delete)
    expect(FelFlame::Entities.empty?).to be true
  end
end