sudoku_bad 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,98 @@
1
+ require 'sudoku/model/coordinate'
2
+
3
+ module Sudoku
4
+ # Represents the Sudoku Grid model.
5
+ class Grid
6
+ attr_reader :cells
7
+
8
+ # Will initialize this grid by given hash of cells. If no
9
+ # cells are given, the grid will have empty values and
10
+ # default cells.
11
+ def initialize(cells = {})
12
+ @cells = cells
13
+ GridFactory.new.generate_all_coordinates.each do |x|
14
+ add_cell(generate_default_cell(x))
15
+ end if cells.empty?
16
+ end
17
+
18
+ # Will return true, if all filled values are other than 0.
19
+ def filled?
20
+ !cells.values.collect(&:value).include?(0)
21
+ end
22
+
23
+ # Will return true, if rules of Sudoku are violated in this
24
+ # grid. Ignores values 0.
25
+ def rules_violated?
26
+ Solver.new(self).rules_violated?
27
+ end
28
+
29
+ # Will return cell at random position from this grid.
30
+ def random_cell
31
+ get_cell(CellCoordinates.random)
32
+ end
33
+
34
+ # Will return particular cell based on given coordinates. If
35
+ # there is not cell on given coordinates, default cell will
36
+ # be created (not filled, editable).
37
+ # * +coordinates+ cell coordinates.
38
+ def get_cell(coordinates)
39
+ cells[coordinates]
40
+ end
41
+
42
+ # Will reset cell on given coordinates by creating the
43
+ # default new one.
44
+ # * +coordinates+ for the newly created cell
45
+ def reset_cell(coordinates)
46
+ add_cell(generate_default_cell(coordinates))
47
+ end
48
+
49
+ # Will generate default cell, which will have the given
50
+ # coordinates, will be ediatable (fixed = false) and will be
51
+ # empty (value = 0)
52
+ # * +coordinates+ coordinates for the new cell
53
+ def generate_default_cell(coordinates)
54
+ Cell.new(coordinates, false, 0)
55
+ end
56
+
57
+ # Will return array of cells stored on a row with given
58
+ # coordinate.
59
+ # * +y+ coordinate of the desired row. Must be in the 0-8 interval.
60
+ def get_row(y)
61
+ fail ArgumentException,
62
+ 'Invalid row access coordinate.' unless Coordinate.valid?(y)
63
+ cells.values.select { |cell| cell.coordinates.coordinate_y == y }.sort
64
+ end
65
+
66
+ # Will return array of cells stored in a given column of this
67
+ # grid.
68
+ # * +x+ coordinate of the desired column. Must be in the 0-8 interval.
69
+ def get_col(x)
70
+ fail ArgumentException,
71
+ 'Invalid column access coordinate.' unless Coordinate.valid?(x)
72
+ cells.values.select { |cell| cell.coordinates.coordinate_x == x }.sort
73
+ end
74
+
75
+ # Will add new cell to the grid. If there is already a cell
76
+ # with the same coordintates, it will be replaced by the new
77
+ # one and the old one will be returned.
78
+ # * +cell+ cell to add
79
+ def add_cell(cell)
80
+ cells[cell.coordinates] = cell
81
+ end
82
+
83
+ # Will return true, it this gird is solved.
84
+ def solved?
85
+ Solver.new(self).solved?
86
+ end
87
+
88
+ # Will return matrix of values of this Grid.
89
+ def to_s
90
+ out = ''
91
+ GridFactory.new.generate_all_coordinates.each_with_index do |x, index|
92
+ out << get_cell(x).value.to_s << x.to_s
93
+ (index + 1).modulo(9).zero? ? out << "\n" : out << ' '
94
+ end
95
+ out
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,61 @@
1
+ require 'sudoku/model/grid'
2
+
3
+ module Sudoku
4
+ # This class provides method for solving or checking solution of the
5
+ # Sudoku game.
6
+ class Solver
7
+ # Will initialize this solver with given grid. Exception is thrown
8
+ # if the given grid is not kind of Sudoku::Grid
9
+ def initialize(grid)
10
+ fail ArgumentError,
11
+ 'Invalid grid passed to solver' unless grid.is_a?(Grid)
12
+ @grid = grid
13
+ end
14
+
15
+ # Will check if the sudoku rules are violated, but the 0 value is
16
+ # ignored. Returns true if violated, false otherwise.
17
+ def rules_violated?
18
+ rows_violated? || cols_violated? || areas_violated?
19
+ end
20
+
21
+ # Will return true, if all cells of the grid are filled and no
22
+ # Sudoku rule is violated.
23
+ def solved?
24
+ !rules_violated? && grid_filled?
25
+ end
26
+
27
+ # Will return true, if the grid is filled, which means, that all
28
+ # of the values are other than 0. False otherwise.
29
+ def grid_filled?
30
+ @grid.filled?
31
+ end
32
+
33
+ # Will return true, if all rows are correctly solved.
34
+ def rows_violated?
35
+ (0..8).to_a.collect { |x|cells_violated?(@grid.get_row(x)) }.any?
36
+ end
37
+
38
+ # Will return true, if all cols are correctly solved.
39
+ def cols_violated?
40
+ (0..8).to_a.collect { |x|cells_violated?(@grid.get_col(x)) }.any?
41
+ end
42
+
43
+ # Will return true, if given set of cells does not contain
44
+ # duplicities in values other than 0.
45
+ # * +cells+ set of cells to check.
46
+ def cells_violated?(cells)
47
+ values = cells.select { |x| x.value != 0 }.collect(&:value)
48
+ values.uniq.size != values.size
49
+ end
50
+
51
+ # Will return true, if in some area of the grid are duplicit or
52
+ # illegal numbers. Returns false otherwise.
53
+ def areas_violated?
54
+ [(0..2), (3..5), (6..8)].repeated_permutation(2).each do |x, y|
55
+ cells = @grid.cells.select { |cell| cell.in_area(x, y) }
56
+ return true if cells_violated?(cells)
57
+ end
58
+ false
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,4 @@
1
+ # Version of this module.
2
+ module Sudoku
3
+ VERSION = '0.0.2'
4
+ end
data/lib/sudoku.rb ADDED
@@ -0,0 +1,8 @@
1
+ require 'sudoku/version'
2
+ require 'simplecov'
3
+ SimpleCov.start
4
+
5
+ # This is the Sudoku module, all code in the lib directory.
6
+ module Sudoku
7
+ # All code in the lib library
8
+ end
@@ -0,0 +1,4 @@
1
+ require File.expand_path('../../lib/sudoku.rb', __FILE__)
2
+
3
+ # Tests for Sudoku model
4
+ require 'sudoku/spec_helper'
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ describe Sudoku::GridFactory do
4
+ GRID_FACTORY ||= Sudoku::GridFactory
5
+ CELL_COORDINATES ||= Sudoku::CellCoordinates
6
+ let(:factory) { GRID_FACTORY.new }
7
+
8
+ before do
9
+ factory.disable_log
10
+ end
11
+
12
+ it 'creates all coordinates set correctly' do
13
+ set = factory.generate_all_coordinates
14
+ expect(set.include?(CELL_COORDINATES.new(0, 0))).to be true
15
+ expect(set.include?(CELL_COORDINATES.new(8, 8))).to be true
16
+ expect(set.size).to eql(81)
17
+ end
18
+
19
+ context 'grid creation' do
20
+ let(:random_grid) { factory.create_random }
21
+ let(:solved_grid) { factory.create_full_grid }
22
+ let(:free_cell) { Sudoku::Cell.new(CELL_COORDINATES.random, false, 5) }
23
+
24
+ it 'the created solved grid does not have any free cells' do
25
+ invalid_cells = solved_grid.cells.values.select { |x| !x.fixed }
26
+ expect(invalid_cells.size).to eql(0)
27
+ end
28
+
29
+ it 'the random grid has no fixed cells with values other than 0' do
30
+ invalid = random_grid.cells.values.select { |x| !x.fixed && x.value > 0 }
31
+ expect(invalid.size).to eql(0)
32
+ end
33
+
34
+ it 'the random grid does not contains fixed cells with value = 0' do
35
+ invalid = random_grid.cells.values.select { |x| x.fixed && x.value == 0 }
36
+ expect(invalid.size).to eql(0)
37
+ end
38
+
39
+ it 'number of opened cells corresponds to the settings of factory' do
40
+ cells = random_grid.cells.values.select { |x| !x.fixed }
41
+ expect(cells.size).to eql(GRID_FACTORY::CELLS_TO_OPEN)
42
+ end
43
+
44
+ it 'parsing of bad sudoku format fails' do
45
+ expect { factory.parse_file('lib/version.rb') }.to raise_error
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe Sudoku::Logging do
4
+ LOGGING ||= Sudoku::Logging
5
+
6
+ let(:some_class) { Class.new.extend(Sudoku::Logging) }
7
+
8
+ before { some_class.disable_log }
9
+
10
+ it 'logger not null' do
11
+ expect(LOGGING::LOGGER).not_to be nil
12
+ end
13
+
14
+ it 'no method raises exception' do
15
+ expect { some_class.info('whatever') }.not_to raise_error
16
+ expect { some_class.error('whatever') }.not_to raise_error
17
+ expect { some_class.fatal('whatever') }.not_to raise_error
18
+ expect { some_class.disable_log }.not_to raise_error
19
+ end
20
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe Sudoku::CellCoordinates do
4
+ CELL_COORDINATES ||= Sudoku::CellCoordinates
5
+ COORDINATE ||= Sudoku::Coordinate
6
+
7
+ let(:cell_coordinates_5_5) { CELL_COORDINATES.new(5, 5) }
8
+ let(:cell_coordinates_7_7) { CELL_COORDINATES.new(7, 7) }
9
+ let(:cell_coordinates_3_7) { CELL_COORDINATES.new(COORDINATE.new(3), 7) }
10
+ let(:cell_coordinates_wrong) { CELL_COORDINATES.new(0, 9) }
11
+
12
+ it 'proper initializations' do
13
+ expect(cell_coordinates_5_5.coordinate_x).to eql(5)
14
+ expect(cell_coordinates_5_5.coordinate_y).to eql(5)
15
+ expect(cell_coordinates_3_7.coordinate_x).to eql(3)
16
+ expect(cell_coordinates_3_7.coordinate_y).to eql(7)
17
+ expect { cell_coordinates_wrong }.to raise_error
18
+ end
19
+
20
+ it 'proper eql method' do
21
+ expect(cell_coordinates_5_5).to eql(cell_coordinates_5_5)
22
+ expect(cell_coordinates_5_5.eql?(CELL_COORDINATES.new(5, 5))).to be true
23
+ expect(cell_coordinates_5_5).not_to eql(cell_coordinates_3_7)
24
+ expect(cell_coordinates_5_5).not_to eql(5)
25
+ end
26
+
27
+ it 'proper to_s method' do
28
+ expect(cell_coordinates_5_5.to_s).to eql('[5, 5]')
29
+ end
30
+
31
+ it 'proper hash method' do
32
+ expect(cell_coordinates_5_5.hash).to eql(CELL_COORDINATES.new(5, 5).hash)
33
+ expect(cell_coordinates_5_5.hash == cell_coordinates_3_7.hash).to be false
34
+ end
35
+ end
@@ -0,0 +1,98 @@
1
+ require 'spec_helper'
2
+
3
+ describe Sudoku::Cell do
4
+ CELL_COORDINATES ||= Sudoku::CellCoordinates
5
+ CELL ||= Sudoku::Cell
6
+ let(:cell_coordinates_5_5) { CELL_COORDINATES.new(5, 5) }
7
+ let(:cell_coordinates_7_7) { CELL_COORDINATES.new(7, 7) }
8
+
9
+ context 'basic simple cells testing' do
10
+ let(:test_cell) { CELL.new(cell_coordinates_5_5, false, 0) }
11
+ let(:custom_cell) { CELL.new(cell_coordinates_5_5, true, 5) }
12
+
13
+ it 'can create valid cell' do
14
+ expect { test_cell }.not_to raise_error
15
+ expect { custom_cell }.not_to raise_error
16
+ end
17
+
18
+ it 'has correct string representation' do
19
+ expect(test_cell.to_s).to eql('[5, 5], 0, false')
20
+ end
21
+
22
+ it 'increments correctly' do
23
+ (0..9).each do |i|
24
+ expect(test_cell.value).to eql(i)
25
+ test_cell.increment
26
+ end
27
+ expect(test_cell.value).to eql(0)
28
+ end
29
+
30
+ it 'decrements correctly' do
31
+ test_cell.decrement
32
+ (9.downto(0)).each do |i|
33
+ expect(test_cell.value).to eql(i)
34
+ test_cell.decrement
35
+ end
36
+ expect(test_cell.value).to eql(9)
37
+ end
38
+
39
+ it 'has correctly set parameters' do
40
+ expect(test_cell.value).to eql(0)
41
+ expect(test_cell.fixed).to eql(false)
42
+ expect(test_cell.coordinates).to eql(cell_coordinates_5_5)
43
+
44
+ expect(custom_cell.value).to eql(5)
45
+ expect(custom_cell.fixed).to eql(true)
46
+ expect(custom_cell.coordinates).to eql(cell_coordinates_5_5)
47
+
48
+ expect(custom_cell.coordinates.coordinate_x).to eql(5)
49
+ expect(custom_cell.coordinates.coordinate_y).to eql(5)
50
+
51
+ expect(test_cell.coordinates.coordinate_x).to eql(5)
52
+ expect(test_cell.coordinates.coordinate_y).to eql(5)
53
+ end
54
+
55
+ it 'the cells on same coordinates are equal' do
56
+ expect(test_cell.eql?(custom_cell)).to be true
57
+ expect(test_cell == custom_cell).to be true
58
+ end
59
+
60
+ it 'the cells with different coordinates are not equal' do
61
+ expect(test_cell.eql?(CELL.new(cell_coordinates_7_7))).to be false
62
+ end
63
+ end
64
+
65
+ it 'does not allow to create fixed 0 cell' do
66
+ expect { CELL.new(cell_coordinates_5_5, true, 0) }.to raise_error
67
+ end
68
+
69
+ it 'accepts only valid coordinates' do
70
+ expect { CELL.new('whatever') }.to raise_error
71
+ end
72
+
73
+ it 'returns correct cell string representation' do
74
+ expect(CELL.new(cell_coordinates_5_5, false, 0).as_string).to eql('')
75
+ expect(CELL.new(cell_coordinates_5_5, true, 5).as_string).to eql('5')
76
+ end
77
+
78
+ context 'setting value to cell' do
79
+ let(:fixed_cell) { CELL.new(cell_coordinates_7_7, true, 5) }
80
+ let(:free_cell) { CELL.new(cell_coordinates_5_5, false, 0) }
81
+
82
+ it 'cant assign value to fixed cell' do
83
+ expect { fixed_cell.value = 5 }.to raise_error
84
+ end
85
+
86
+ it 'cant assign values out of interval 0-9' do
87
+ expect { free_cell.value = -1 }.to raise_error
88
+ expect { free_cell.value = 10 }.to raise_error
89
+ end
90
+
91
+ it 'can assign correct values' do
92
+ expect { free_cell.value = 0 }.not_to raise_error
93
+ expect { free_cell.value = 9 }.not_to raise_error
94
+ expect { free_cell.value = 2 }.not_to raise_error
95
+ expect(free_cell.value).to eql(2)
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,39 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe Sudoku::Coordinate do
4
+ COORDINATE ||= Sudoku::Coordinate
5
+
6
+ let(:coordinate5) { COORDINATE.new(5) }
7
+ let(:coordinate7) { COORDINATE.new(7) }
8
+ let(:coordinate0) { COORDINATE.new(0) }
9
+ let(:coordinate8) { COORDINATE.new(8) }
10
+
11
+ it 'accepts the number and COORDINATE in the constructor' do
12
+ expect(COORDINATE.new(5).coordinate).to eq(5)
13
+ expect(COORDINATE.new(COORDINATE.new(5)).coordinate).to eq(5)
14
+ end
15
+
16
+ it 'returns correct string' do
17
+ expect(coordinate5.to_s).to eq(5.to_s)
18
+ expect(coordinate5.to_s).not_to eq(10.to_s)
19
+ end
20
+
21
+ it 'converts to_i and to_int' do
22
+ expect(coordinate5.to_i).to eq(5.to_i)
23
+ expect(coordinate5.to_int).to eq(5.to_int)
24
+ expect(coordinate5.to_i).not_to eq(10.to_i)
25
+ end
26
+
27
+ it 'compares with coordinate and number' do
28
+ expect(coordinate5).to be < coordinate7
29
+ expect(coordinate7).to be > coordinate5
30
+ expect(coordinate5).to be == COORDINATE.new(5)
31
+ end
32
+
33
+ it 'accepts only vales from the interval 0-8 inclusive' do
34
+ expect { COORDINATE.new(10) }.to raise_error ArgumentError
35
+ expect { COORDINATE.new(-10) }.to raise_error ArgumentError
36
+ expect { COORDINATE.new(0) }.not_to raise_error
37
+ expect { COORDINATE.new(8) }.not_to raise_error
38
+ end
39
+ end
@@ -0,0 +1,9 @@
1
+ 0[0, 0] 0[1, 0] 0[2, 0] 0[3, 0] 0[4, 0] 0[5, 0] 0[6, 0] 0[7, 0] 0[8, 0]
2
+ 0[0, 1] 0[1, 1] 0[2, 1] 0[3, 1] 0[4, 1] 0[5, 1] 0[6, 1] 0[7, 1] 0[8, 1]
3
+ 0[0, 2] 0[1, 2] 0[2, 2] 0[3, 2] 0[4, 2] 0[5, 2] 0[6, 2] 0[7, 2] 0[8, 2]
4
+ 0[0, 3] 0[1, 3] 0[2, 3] 0[3, 3] 0[4, 3] 0[5, 3] 0[6, 3] 0[7, 3] 0[8, 3]
5
+ 0[0, 4] 0[1, 4] 0[2, 4] 0[3, 4] 0[4, 4] 0[5, 4] 0[6, 4] 0[7, 4] 0[8, 4]
6
+ 0[0, 5] 0[1, 5] 0[2, 5] 0[3, 5] 0[4, 5] 0[5, 5] 0[6, 5] 0[7, 5] 0[8, 5]
7
+ 0[0, 6] 0[1, 6] 0[2, 6] 0[3, 6] 0[4, 6] 0[5, 6] 0[6, 6] 0[7, 6] 0[8, 6]
8
+ 0[0, 7] 0[1, 7] 0[2, 7] 0[3, 7] 0[4, 7] 0[5, 7] 0[6, 7] 0[7, 7] 0[8, 7]
9
+ 0[0, 8] 0[1, 8] 0[2, 8] 0[3, 8] 0[4, 8] 0[5, 8] 0[6, 8] 0[7, 8] 0[8, 8]
@@ -0,0 +1,97 @@
1
+ require 'spec_helper'
2
+
3
+ describe Sudoku::Grid do
4
+ CELL_COORDINATES ||= Sudoku::CellCoordinates
5
+ CELL ||= Sudoku::Cell
6
+ GRID ||= Sudoku::Grid
7
+
8
+ let(:cell_coordinates_5_5) { CELL_COORDINATES.new(5, 5) }
9
+ let(:cell_coordinates_7_7) { CELL_COORDINATES.new(7, 7) }
10
+ let(:fixed_cell) { CELL.new(cell_coordinates_5_5, true, 5) }
11
+ let(:free_cell) { CELL.new(cell_coordinates_7_7, false, 0) }
12
+ let(:same_free_cell) { CELL.new(cell_coordinates_7_7, true, 7) }
13
+ let(:test_grid) { GRID.new }
14
+ let(:factory) { Sudoku::GridFactory.new }
15
+
16
+ before { factory.disable_log }
17
+
18
+ context 'adding elements' do
19
+ it 'adds elements' do
20
+ test_grid.add_cell(fixed_cell)
21
+ cell_stored = test_grid.get_cell(cell_coordinates_5_5)
22
+ expect(cell_stored).not_to be_nil
23
+ expect(cell_stored.value).to eql(5)
24
+ expect(cell_stored.fixed).to be true
25
+ expect(cell_stored.coordinates == cell_coordinates_5_5).to be true
26
+ end
27
+
28
+ it 'replaces element which exists' do
29
+ test_grid.add_cell(free_cell)
30
+ test_grid.add_cell(same_free_cell)
31
+ cell_stored = test_grid.get_cell(cell_coordinates_7_7)
32
+
33
+ expect(cell_stored.value).to eql(same_free_cell.value)
34
+ expect(cell_stored.coordinates).to eql(same_free_cell.coordinates)
35
+ expect(cell_stored.fixed).to eql(same_free_cell.fixed)
36
+ end
37
+ end
38
+
39
+ context 'getting elements' do
40
+ let(:grid) { Sudoku::GridFactory.new.create_random }
41
+
42
+ it 'returns default element, when element does not exist' do
43
+ cell_stored = test_grid.get_cell(cell_coordinates_7_7)
44
+ default_cell = test_grid.generate_default_cell(cell_coordinates_7_7)
45
+
46
+ expect(cell_stored.value).to eql(default_cell.value)
47
+ expect(cell_stored.coordinates).to eql(default_cell.coordinates)
48
+ expect(cell_stored.fixed).to eql(default_cell.fixed)
49
+ end
50
+ end
51
+
52
+ context 'misc operations' do
53
+ let(:grid) { factory.create_random }
54
+ let(:full_grid) { factory.create_full_grid }
55
+ let(:invalid_grid) do
56
+ grid = factory.create_full_grid
57
+ grid.add_cell(CELL.new(CELL_COORDINATES.new(0, 0), false, 5))
58
+ grid.add_cell(CELL.new(CELL_COORDINATES.new(1, 0), false, 5))
59
+ grid
60
+ end
61
+
62
+ it 'test filled properly' do
63
+ expect(GRID.new.filled?).to be false
64
+ expect(Sudoku::GridFactory.new.create_full_grid.filled?).to be true
65
+ end
66
+
67
+ it 'test grid violation' do
68
+ expect(full_grid.rules_violated?).to be false
69
+ expect(invalid_grid.rules_violated?).to be true
70
+ end
71
+
72
+ it 'test grid solved' do
73
+ expect(full_grid.solved?).to be true
74
+ expect(invalid_grid.solved?).to be false
75
+ expect(grid.solved?).to be false
76
+ end
77
+
78
+ it 'resets cell' do
79
+ default_cell = grid.generate_default_cell(cell_coordinates_5_5)
80
+ grid.reset_cell(default_cell.coordinates)
81
+ reset_cell = grid.get_cell(default_cell.coordinates)
82
+
83
+ expect(default_cell.coordinates).to eql(reset_cell.coordinates)
84
+ expect(default_cell.value).to eql(reset_cell.value)
85
+ expect(default_cell.fixed).to eql(reset_cell.fixed)
86
+ expect(default_cell == reset_cell).to be true
87
+ end
88
+
89
+ it 'has correct to_s method' do
90
+ path = 'spec/sudoku/model/empty_grid.txt'
91
+ empty_grid_s = GRID.new.to_s
92
+ (File.open(path).zip empty_grid_s.lines).each do |x, y|
93
+ expect(x).to eql(y)
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,3 @@
1
+ # This will add all files in the model directory
2
+ require 'require_all'
3
+ require_all File.expand_path('../../../../lib/sudoku/model', __FILE__)
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe Sudoku::Solver do
4
+ SOLVER ||= Sudoku::Solver
5
+ CELL ||= Sudoku::Cell
6
+ CELL_COORDINATES ||= Sudoku::CellCoordinates
7
+
8
+ let(:factory) { Sudoku::GridFactory.new }
9
+
10
+ before do
11
+ factory.disable_log
12
+ end
13
+
14
+ context 'cells set solving' do
15
+ let(:solver) { SOLVER.new(factory.create_full_grid) }
16
+ let(:solvable) do
17
+ (1..9).to_a.collect { |x| CELL.new(CELL_COORDINATES.random, false, x) }
18
+ end
19
+
20
+ it 'solves the 9 cells set' do
21
+ expect(solver.cells_violated?(solvable)).to be false
22
+ end
23
+
24
+ it 'does not accept invalid set' do
25
+ solvable[5].value = 4
26
+ expect(solver.cells_violated?(solvable)).to be true
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,3 @@
1
+ require_relative 'model/spec_helper'
2
+ require 'require_all'
3
+ require_all File.expand_path('../../../lib/sudoku', __FILE__)
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ # Sudoku test
4
+ describe Sudoku do
5
+ it 'prototype test does not fail' do
6
+ true
7
+ end
8
+
9
+ it 'version must not be nil' do
10
+ expect(Sudoku::VERSION).not_to be_nil
11
+ end
12
+ end
data/sudoku.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'sudoku/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "sudoku_bad"
8
+ spec.version = Sudoku::VERSION
9
+ spec.authors = ["Tomáš Hauk"]
10
+ spec.email = ["hauktoma@fit.cvut.cz"]
11
+ spec.summary = %q{This is a basic gem for Sudoku program.}
12
+ spec.description = %q{Dont use this software.}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.7"
22
+ spec.add_development_dependency "rake", "~> 10.0"
23
+ spec.add_development_dependency "rspec"
24
+ spec.add_development_dependency "require_all"
25
+ spec.add_development_dependency "guard"
26
+ spec.add_development_dependency "guard-rspec"
27
+ spec.add_development_dependency "simplecov"
28
+ spec.add_development_dependency "green_shoes"
29
+ end