jpalardy-forgetful 0.0.6 → 0.1.0

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.
@@ -50,7 +50,7 @@ def process_file(filename)
50
50
  #--------------------- quiz ----------------------
51
51
  reminders = Reminder.read_csv(filename)
52
52
 
53
- dues, not_dues = reminders.partition {|reminder| reminder.execute_on <= Date.today}
53
+ dues, not_dues = reminders.partition {|reminder| reminder.due_on <= Date.today}
54
54
 
55
55
  puts "### QUIZ: #{filename}"
56
56
  gradeds = quiz(dues.sort_by { rand })
@@ -1,23 +1,23 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = %q{forgetful}
3
- s.version = "0.0.6"
3
+ s.version = "0.1.0"
4
4
 
5
5
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
6
6
  s.authors = ["Jonathan Palardy"]
7
- s.date = %q{2008-11-13}
7
+ s.date = %q{2008-11-21}
8
8
  s.default_executable = %q{forgetful}
9
9
  s.description = %q{A minimal command-line implementation of the SuperMemo 2 algorithm.}
10
10
  s.email = %q{jonathan.palardy@gmail.com}
11
11
  s.executables = ["forgetful"]
12
- s.extra_rdoc_files = ["bin/forgetful", "lib/csv_ext/reminder.rb", "lib/forgetful.rb", "lib/reminder.rb", "README.rdoc"]
13
- s.files = ["bin/forgetful", "examples/katakana_romanji.csv", "examples/romanji_katakana.csv", "lib/csv_ext/reminder.rb", "lib/forgetful.rb", "lib/reminder.rb", "Manifest", "MIT-LICENSE", "README.rdoc", "test/test_reminder.rb", "test/test_reminder_csv.rb", "forgetful.gemspec"]
12
+ s.extra_rdoc_files = ["bin/forgetful", "lib/csv_ext/reminder.rb", "lib/forgetful.rb", "lib/reminder.rb", "lib/supermemo.rb", "README.rdoc"]
13
+ s.files = ["bin/forgetful", "examples/katakana_romanji.csv", "examples/romanji_katakana.csv", "lib/csv_ext/reminder.rb", "lib/forgetful.rb", "lib/reminder.rb", "lib/supermemo.rb", "Manifest", "MIT-LICENSE", "README.rdoc", "test/test_reminder.rb", "test/test_reminder_csv.rb", "test/test_supermemo.rb", "forgetful.gemspec"]
14
14
  s.homepage = %q{http://github.com/jpalardy/forgetful}
15
15
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Forgetful", "--main", "README.rdoc"]
16
16
  s.require_paths = ["lib"]
17
17
  s.rubyforge_project = %q{forgetful}
18
18
  s.rubygems_version = %q{1.2.0}
19
19
  s.summary = %q{A minimal command-line implementation of the SuperMemo 2 algorithm.}
20
- s.test_files = ["test/test_reminder.rb", "test/test_reminder_csv.rb"]
20
+ s.test_files = ["test/test_reminder.rb", "test/test_reminder_csv.rb", "test/test_supermemo.rb"]
21
21
 
22
22
  if s.respond_to? :specification_version then
23
23
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
@@ -13,11 +13,9 @@ class Reminder
13
13
  def self.parse_csv(io)
14
14
  converters = [lambda {|question| question},
15
15
  lambda {|answer| answer},
16
- lambda {|execute_on| Date.parse(execute_on)},
17
- lambda {|ef| ef.to_f},
18
- lambda {|i| i.to_i},
19
- lambda {|interval| interval.to_i},
20
- lambda {|q| q.nil? ? q : q.to_i}]
16
+ lambda {|due_on| Date.parse(due_on)},
17
+ lambda {|history| history.scan(/./).collect {|x| x.to_i}}
18
+ ]
21
19
 
22
20
  FasterCSV.parse(io, :skip_blanks => true).collect do |list|
23
21
  list = list.zip(converters).collect {|col, converter| converter[col]}
@@ -36,7 +34,7 @@ class Reminder
36
34
  def self.generate_csv(reminders)
37
35
  FasterCSV.generate do |csv|
38
36
  reminders.each do |reminder|
39
- if reminder.to_a.last.nil? # future reminder, never graded
37
+ if reminder.history.empty?
40
38
  csv << reminder.to_a.first(3)
41
39
  else
42
40
  csv << reminder.to_a
@@ -1,7 +1,5 @@
1
- class Forgetful
2
- VERSION = '0.0.1'
3
- end
4
1
 
2
+ require "#{File.dirname(__FILE__)}/supermemo"
5
3
  require "#{File.dirname(__FILE__)}/reminder"
6
4
  require "#{File.dirname(__FILE__)}/csv_ext/reminder"
7
5
 
@@ -1,36 +1,20 @@
1
1
 
2
2
  class Reminder
3
- attr_reader :question, :answer, :execute_on, :ef, :i, :interval, :q
3
+ attr_reader :question, :answer, :due_on, :history
4
4
 
5
- def initialize(question, answer, execute_on=Date.today, ef=2.5, i=0, interval=0, q=nil)
5
+ def initialize(question, answer, due_on=Date.today, history=[])
6
6
  @question = question
7
7
  @answer = answer
8
- @execute_on = execute_on
9
- @ef = ef
10
- @i = i
11
- @interval = interval
12
- @q = q
8
+ @due_on = due_on
9
+ @history = history.dup.freeze
13
10
  end
14
11
 
15
12
  def next(q)
16
- if q < 3
17
- i = 0
18
- interval = 1
19
- else
20
- i = self.i + 1
21
- interval = {0 => 1, 1 => 6}.fetch(self.i, self.interval * self.ef).round
22
- end
23
-
24
- execute_on = Date.today + interval
25
-
26
- ef = self.ef + (0.1 - (5-q) * (0.08 + (5-q) * 0.02))
27
- ef = [ef, 1.3].max
28
-
29
- Reminder.new(self.question, self.answer, execute_on, ef, i, interval, q)
13
+ Reminder.new(self.question, self.answer, SuperMemo::next_date(Date.today, self.history + [q]), self.history + [q])
30
14
  end
31
15
 
32
16
  def to_a
33
- [self.question, self.answer, self.execute_on, self.ef, self.i, self.interval, self.q]
17
+ [self.question, self.answer, self.due_on, self.history]
34
18
  end
35
19
 
36
20
  def <=>(other)
@@ -38,7 +22,7 @@ class Reminder
38
22
  end
39
23
 
40
24
  def review?
41
- q < 4
25
+ (self.history.last || 0) < 4
42
26
  end
43
27
 
44
28
  end
@@ -0,0 +1,34 @@
1
+
2
+ module SuperMemo
3
+
4
+ def self.next_ef(q, ef)
5
+ return [ef + (0.1 - (5-q) * (0.08 + (5-q) * 0.02)), 1.3].max
6
+ end
7
+
8
+ def self.next_i(q, i)
9
+ return q < 3 ? 0 : i+1
10
+ end
11
+
12
+ def self.next_interval(q, ef, i, interval)
13
+ return q < 3 ? 1 : {0 => 1, 1 => 6}.fetch(i, interval * ef).round
14
+ end
15
+
16
+ #-------------------------------------------------
17
+
18
+ # [] -> 2.5, 0, 0
19
+ # [5,5,5] -> 2.8, 3, 16
20
+ def self.traverse(qs, ef=2.5, i=0, interval=0)
21
+ return [ef, i, interval] if qs.empty?
22
+
23
+ q = qs.first
24
+ return traverse(qs[1..-1], next_ef(q, ef), next_i(q, i), next_interval(q, ef, i, interval))
25
+ end
26
+
27
+ def self.next_date(date, qs)
28
+ ef, i, interval = traverse(qs)
29
+ return date + interval
30
+ end
31
+
32
+ end
33
+
34
+
@@ -2,7 +2,6 @@
2
2
  require 'test/unit'
3
3
  require "#{File.dirname(__FILE__)}/../lib/forgetful"
4
4
 
5
-
6
5
  class TestReminder < Test::Unit::TestCase
7
6
 
8
7
  def assert_raise_message(error, re)
@@ -14,10 +13,6 @@ class TestReminder < Test::Unit::TestCase
14
13
 
15
14
  #-------------------------------------------------
16
15
 
17
- def assert_equal_inspect(expected, actual)
18
- assert_equal expected.inspect, actual.inspect
19
- end
20
-
21
16
  def setup
22
17
  @carbon_question = Reminder.new 'carbon', '6'
23
18
  end
@@ -41,88 +36,64 @@ class TestReminder < Test::Unit::TestCase
41
36
  def test_minimum
42
37
  assert_equal 'carbon', @carbon_question.question
43
38
  assert_equal '6', @carbon_question.answer
44
- assert_equal Date.today, @carbon_question.execute_on
45
- assert_equal 2.5, @carbon_question.ef
46
- assert_equal 0, @carbon_question.i
47
- assert_equal 0, @carbon_question.interval
48
- assert_equal nil, @carbon_question.q
39
+ assert_equal Date.today, @carbon_question.due_on
40
+ assert_equal [], @carbon_question.history
49
41
  end
50
42
 
51
43
  def test_minium_array
52
- assert_equal ['carbon', '6', Date.today, 2.5, 0, 0, nil], [@carbon_question.question, @carbon_question.answer, @carbon_question.execute_on, @carbon_question.ef, @carbon_question.i, @carbon_question.interval, @carbon_question.q]
44
+ assert_equal ['carbon', '6', Date.today, []], @carbon_question.to_a
53
45
  end
54
46
 
55
47
  #-------------------------------------------------
56
48
 
57
- def test_next
58
- assert_equal_inspect ['carbon', '6', Date.today+1, 1.7, 0, 1, 0], @carbon_question.next(0).to_a
59
- assert_equal_inspect ['carbon', '6', Date.today+1, 1.96, 0, 1, 1], @carbon_question.next(1).to_a
60
- assert_equal_inspect ['carbon', '6', Date.today+1, 2.18, 0, 1, 2], @carbon_question.next(2).to_a
61
- assert_equal_inspect ['carbon', '6', Date.today+1, 2.36, 1, 1, 3], @carbon_question.next(3).to_a
62
- assert_equal_inspect ['carbon', '6', Date.today+1, 2.5, 1, 1, 4], @carbon_question.next(4).to_a
63
- assert_equal_inspect ['carbon', '6', Date.today+1, 2.6, 1, 1, 5], @carbon_question.next(5).to_a
64
- end
49
+ def test_history_cannot_be_changed
50
+ history = [5,4,2]
65
51
 
66
- def test_next_after_0
67
- assert_equal_inspect ['carbon', '6', Date.today+1, 1.3, 0, 1, 0], @carbon_question.next(0).next(0).to_a
68
- assert_equal_inspect ['carbon', '6', Date.today+1, 1.3, 0, 1, 1], @carbon_question.next(0).next(1).to_a
69
- assert_equal_inspect ['carbon', '6', Date.today+1, 1.38, 0, 1, 2], @carbon_question.next(0).next(2).to_a
70
- assert_equal_inspect ['carbon', '6', Date.today+1, 1.56, 1, 1, 3], @carbon_question.next(0).next(3).to_a
71
- assert_equal_inspect ['carbon', '6', Date.today+1, 1.7, 1, 1, 4], @carbon_question.next(0).next(4).to_a
72
- assert_equal_inspect ['carbon', '6', Date.today+1, 1.8, 1, 1, 5], @carbon_question.next(0).next(5).to_a
73
- end
52
+ reminder = Reminder.new('carbon','6',Date.today, history)
74
53
 
75
- def test_next_after_1
76
- assert_equal_inspect ['carbon', '6', Date.today+1, 1.3, 0, 1, 0], @carbon_question.next(1).next(0).to_a
77
- assert_equal_inspect ['carbon', '6', Date.today+1, 1.42, 0, 1, 1], @carbon_question.next(1).next(1).to_a
78
- assert_equal_inspect ['carbon', '6', Date.today+1, 1.64, 0, 1, 2], @carbon_question.next(1).next(2).to_a
79
- assert_equal_inspect ['carbon', '6', Date.today+1, 1.82, 1, 1, 3], @carbon_question.next(1).next(3).to_a
80
- assert_equal_inspect ['carbon', '6', Date.today+1, 1.96, 1, 1, 4], @carbon_question.next(1).next(4).to_a
81
- assert_equal_inspect ['carbon', '6', Date.today+1, 2.06, 1, 1, 5], @carbon_question.next(1).next(5).to_a
82
- end
54
+ assert_equal [5,4,2], reminder.history
83
55
 
84
- def test_next_after_2
85
- assert_equal_inspect ['carbon', '6', Date.today+1, 1.38, 0, 1, 0], @carbon_question.next(2).next(0).to_a
86
- assert_equal_inspect ['carbon', '6', Date.today+1, 1.64, 0, 1, 1], @carbon_question.next(2).next(1).to_a
87
- assert_equal_inspect ['carbon', '6', Date.today+1, 1.86, 0, 1, 2], @carbon_question.next(2).next(2).to_a
88
- assert_equal_inspect ['carbon', '6', Date.today+1, 2.04, 1, 1, 3], @carbon_question.next(2).next(3).to_a
89
- assert_equal_inspect ['carbon', '6', Date.today+1, 2.18, 1, 1, 4], @carbon_question.next(2).next(4).to_a
90
- assert_equal_inspect ['carbon', '6', Date.today+1, 2.28, 1, 1, 5], @carbon_question.next(2).next(5).to_a
91
- end
56
+ assert_raise_message TypeError, /can't modify frozen array/ do
57
+ @carbon_question.history.push(5)
58
+ end
59
+
60
+ history.push(5)
92
61
 
93
- def test_next_after_3
94
- assert_equal_inspect ['carbon', '6', Date.today+1, 1.56, 0, 1, 0], @carbon_question.next(3).next(0).to_a
95
- assert_equal_inspect ['carbon', '6', Date.today+1, 1.82, 0, 1, 1], @carbon_question.next(3).next(1).to_a
96
- assert_equal_inspect ['carbon', '6', Date.today+1, 2.04, 0, 1, 2], @carbon_question.next(3).next(2).to_a
97
- assert_equal_inspect ['carbon', '6', Date.today+6, 2.22, 2, 6, 3], @carbon_question.next(3).next(3).to_a
98
- assert_equal_inspect ['carbon', '6', Date.today+6, 2.36, 2, 6, 4], @carbon_question.next(3).next(4).to_a
99
- assert_equal_inspect ['carbon', '6', Date.today+6, 2.46, 2, 6, 5], @carbon_question.next(3).next(5).to_a
62
+ assert_equal [], @carbon_question.history
100
63
  end
101
64
 
102
- def test_next_after_4
103
- assert_equal_inspect ['carbon', '6', Date.today+1, 1.7, 0, 1, 0], @carbon_question.next(4).next(0).to_a
104
- assert_equal_inspect ['carbon', '6', Date.today+1, 1.96, 0, 1, 1], @carbon_question.next(4).next(1).to_a
105
- assert_equal_inspect ['carbon', '6', Date.today+1, 2.18, 0, 1, 2], @carbon_question.next(4).next(2).to_a
106
- assert_equal_inspect ['carbon', '6', Date.today+6, 2.36, 2, 6, 3], @carbon_question.next(4).next(3).to_a
107
- assert_equal_inspect ['carbon', '6', Date.today+6, 2.5, 2, 6, 4], @carbon_question.next(4).next(4).to_a
108
- assert_equal_inspect ['carbon', '6', Date.today+6, 2.6, 2, 6, 5], @carbon_question.next(4).next(5).to_a
65
+ #-------------------------------------------------
66
+
67
+ def test_next_clamped
68
+ assert_equal ['carbon', '6', Date.today+1, [1]], @carbon_question.next(1).to_a
69
+ assert_equal ['carbon', '6', Date.today+1, [4]], @carbon_question.next(4).to_a
109
70
  end
110
71
 
111
- def test_next_after_5
112
- assert_equal_inspect ['carbon', '6', Date.today+1, 1.8, 0, 1, 0], @carbon_question.next(5).next(0).to_a
113
- assert_equal_inspect ['carbon', '6', Date.today+1, 2.06, 0, 1, 1], @carbon_question.next(5).next(1).to_a
114
- assert_equal_inspect ['carbon', '6', Date.today+1, 2.28, 0, 1, 2], @carbon_question.next(5).next(2).to_a
115
- assert_equal_inspect ['carbon', '6', Date.today+6, 2.46, 2, 6, 3], @carbon_question.next(5).next(3).to_a
116
- assert_equal_inspect ['carbon', '6', Date.today+6, 2.6, 2, 6, 4], @carbon_question.next(5).next(4).to_a
117
- assert_equal_inspect ['carbon', '6', Date.today+6, 2.7, 2, 6, 5], @carbon_question.next(5).next(5).to_a
72
+ def test_next_unclamped
73
+ reminder = Reminder.new('carbon', '6', Date.today, [5,5])
74
+
75
+ assert_equal ['carbon', '6', Date.today+1, [5,5,1]], reminder.next(1).to_a
76
+ assert_equal ['carbon', '6', Date.today+16, [5,5,4]], reminder.next(4).to_a
118
77
  end
119
78
 
120
79
  #-------------------------------------------------
121
80
 
122
- # will ask tomorrow?
123
- def test_fail_after_long_interval
124
- oxygen_question = Reminder.new('oxygen', '8', Date.today, 3.2, 7, 393)
125
- assert_equal_inspect ['oxygen', '8', Date.today+1, 2.4, 0, 1, 0], oxygen_question.next(0).to_a
81
+ def test_review
82
+ assert_equal true, @carbon_question.review?
83
+ assert_equal true, @carbon_question.next(0).review?
84
+ assert_equal true, @carbon_question.next(1).review?
85
+ assert_equal true, @carbon_question.next(2).review?
86
+ assert_equal true, @carbon_question.next(3).review?
87
+ assert_equal false, @carbon_question.next(4).review?
88
+ assert_equal false, @carbon_question.next(5).review?
89
+
90
+ assert_equal true, @carbon_question.next(5).next(0).review?
91
+ assert_equal true, @carbon_question.next(5).next(1).review?
92
+ assert_equal true, @carbon_question.next(5).next(2).review?
93
+ assert_equal true, @carbon_question.next(5).next(3).review?
94
+ assert_equal false, @carbon_question.next(5).next(4).review?
95
+ assert_equal false, @carbon_question.next(5).next(5).review?
126
96
  end
127
97
 
128
98
  end
99
+
@@ -2,15 +2,8 @@
2
2
  require 'test/unit'
3
3
  require "#{File.dirname(__FILE__)}/../lib/forgetful"
4
4
 
5
-
6
5
  class TestReminderCSV < Test::Unit::TestCase
7
6
 
8
- def assert_equal_inspect(expected, actual)
9
- assert_equal expected.inspect, actual.inspect
10
- end
11
-
12
- #-------------------------------------------------
13
-
14
7
  def test_parse_csv_bare
15
8
  csv = <<END
16
9
  carbon,6
@@ -22,9 +15,9 @@ END
22
15
 
23
16
  assert_equal 3, reminders.length
24
17
 
25
- assert_equal_inspect ['carbon', '6',Date.today, 2.5, 0, 0, nil], reminders[0].to_a
26
- assert_equal_inspect ['nitrogen','7',Date.today, 2.5, 0, 0, nil], reminders[1].to_a
27
- assert_equal_inspect ['oxygen', '8',Date.today, 2.5, 0, 0, nil], reminders[2].to_a
18
+ assert_equal ['carbon', '6',Date.today, []], reminders[0].to_a
19
+ assert_equal ['nitrogen','7',Date.today, []], reminders[1].to_a
20
+ assert_equal ['oxygen', '8',Date.today, []], reminders[2].to_a
28
21
  end
29
22
 
30
23
  def test_parse_csv_with_dates
@@ -38,35 +31,35 @@ END
38
31
 
39
32
  assert_equal 3, reminders.length
40
33
 
41
- assert_equal_inspect ['carbon', '6',Date.parse('2008-11-11'), 2.5, 0, 0, nil], reminders[0].to_a
42
- assert_equal_inspect ['nitrogen','7',Date.parse('2008-11-11'), 2.5, 0, 0, nil], reminders[1].to_a
43
- assert_equal_inspect ['oxygen', '8',Date.parse('2008-11-11'), 2.5, 0, 0, nil], reminders[2].to_a
34
+ assert_equal ['carbon', '6',Date.parse('2008-11-11'), []], reminders[0].to_a
35
+ assert_equal ['nitrogen','7',Date.parse('2008-11-11'), []], reminders[1].to_a
36
+ assert_equal ['oxygen', '8',Date.parse('2008-11-11'), []], reminders[2].to_a
44
37
  end
45
38
 
46
39
  def test_parse_csv_full
47
40
  csv = <<END
48
- carbon,6,2008-11-11,2.5,0,0,
49
- nitrogen,7,2008-11-11,2.5,0,0,
50
- oxygen,8,2008-11-11,2.5,0,0,
41
+ carbon,6,2008-11-11,5
42
+ nitrogen,7,2008-11-11,535
43
+ oxygen,8,2008-11-11,5042
51
44
  END
52
45
 
53
46
  reminders = Reminder.parse_csv(csv)
54
47
 
55
48
  assert_equal 3, reminders.length
56
49
 
57
- assert_equal_inspect ['carbon', '6',Date.parse('2008-11-11'), 2.5, 0, 0, nil], reminders[0].to_a
58
- assert_equal_inspect ['nitrogen','7',Date.parse('2008-11-11'), 2.5, 0, 0, nil], reminders[1].to_a
59
- assert_equal_inspect ['oxygen', '8',Date.parse('2008-11-11'), 2.5, 0, 0, nil], reminders[2].to_a
50
+ assert_equal ['carbon', '6',Date.parse('2008-11-11'), [5]], reminders[0].to_a
51
+ assert_equal ['nitrogen','7',Date.parse('2008-11-11'), [5,3,5]], reminders[1].to_a
52
+ assert_equal ['oxygen', '8',Date.parse('2008-11-11'), [5,0,4,2]], reminders[2].to_a
60
53
  end
61
54
 
62
55
  def test_parse_csv_full_with_spaces
63
56
  csv = <<END
64
57
 
65
- carbon,6,2008-11-11,2.5,0,0,
58
+ carbon,6,2008-11-11,035
66
59
 
67
60
 
68
- nitrogen,7,2008-11-11,2.5,0,0,
69
- oxygen,8,2008-11-11,2.5,0,0,
61
+ nitrogen,7,2008-11-11,55555
62
+ oxygen,8,2008-11-11,1
70
63
 
71
64
  END
72
65
 
@@ -74,9 +67,9 @@ END
74
67
 
75
68
  assert_equal 3, reminders.length
76
69
 
77
- assert_equal_inspect ['carbon', '6',Date.parse('2008-11-11'), 2.5, 0, 0, nil], reminders[0].to_a
78
- assert_equal_inspect ['nitrogen','7',Date.parse('2008-11-11'), 2.5, 0, 0, nil], reminders[1].to_a
79
- assert_equal_inspect ['oxygen', '8',Date.parse('2008-11-11'), 2.5, 0, 0, nil], reminders[2].to_a
70
+ assert_equal ['carbon', '6',Date.parse('2008-11-11'), [0,3,5]], reminders[0].to_a
71
+ assert_equal ['nitrogen','7',Date.parse('2008-11-11'), [5,5,5,5,5]], reminders[1].to_a
72
+ assert_equal ['oxygen', '8',Date.parse('2008-11-11'), [1]], reminders[2].to_a
80
73
  end
81
74
 
82
75
  ############################################################
@@ -91,9 +84,9 @@ END
91
84
 
92
85
  expected =<<END
93
86
  carbon,6,#{Date.today}
94
- nitrogen,7,#{(Date.today+16)},2.8,3,16,5
95
- oxygen,8,#{(Date.today+1)},1.3,0,1,1
96
- fluorine,9,#{(Date.today+1)},1.62,1,1,5
87
+ nitrogen,7,#{(Date.today+16)},555
88
+ oxygen,8,#{(Date.today+1)},111
89
+ fluorine,9,#{(Date.today+1)},1515
97
90
  neon,10,#{(Date.today+5)}
98
91
  END
99
92
 
@@ -101,3 +94,4 @@ END
101
94
  end
102
95
 
103
96
  end
97
+
@@ -0,0 +1,85 @@
1
+
2
+ require 'test/unit'
3
+ require "#{File.dirname(__FILE__)}/../lib/forgetful"
4
+
5
+ class TestReminder < Test::Unit::TestCase
6
+
7
+ def test_next_i
8
+ qs = [5,4,3,2,1,0]
9
+ results = [4,4,4,0,0,0]
10
+
11
+ qs.zip(results).each do |q,result|
12
+ assert_equal result, SuperMemo::next_i(q, 3), "next_i for q=#{q} when i=3"
13
+ end
14
+ end
15
+
16
+ def test_next_interval_normal
17
+ qs = [5,4,3,2,1,0]
18
+ results = [16,16,16,1,1,1]
19
+
20
+ qs.zip(results).each do |q,result|
21
+ assert_equal result, SuperMemo::next_interval(q, 2.7, 2, 6), "next_interval for q=#{q}"
22
+ end
23
+ end
24
+
25
+ def test_next_interval_for_i0
26
+ qs = [5,4,3,2,1,0]
27
+ results = [1,1,1,1,1,1]
28
+
29
+ qs.zip(results).each do |q,result|
30
+ assert_equal result, SuperMemo::next_interval(q, 2.5, 0, 0), "next_interval for q=#{q}"
31
+ end
32
+ end
33
+
34
+ def test_next_interval_for_i1
35
+ qs = [5,4,3,2,1,0]
36
+ results = [6,6,6,1,1,1]
37
+
38
+ qs.zip(results).each do |q,result|
39
+ assert_equal result, SuperMemo::next_interval(q, 2.5, 1, 1), "next_interval for q=#{q}"
40
+ end
41
+ end
42
+
43
+ def test_next_interval_for_changing_efs
44
+ efs = [1.3, 2.0, 2.5, 2.6, 2.7]
45
+ results = [8,12,15,16,16]
46
+
47
+ efs.zip(results).each do |ef,result|
48
+ assert_equal result, SuperMemo::next_interval(5, ef, 2, 6), "next_interval for ef=#{ef}"
49
+ end
50
+ end
51
+
52
+ def test_next_ef_normal
53
+ qs = [5,4,3,2,1,0]
54
+ results = [2.6,2.5,2.36,2.18,1.96,1.7]
55
+
56
+ qs.zip(results).each do |q,result|
57
+ assert_in_delta result, SuperMemo::next_ef(q, 2.5), 0.00001, "next_ef for q=#{q}"
58
+ end
59
+ end
60
+
61
+ def test_next_ef_minimum
62
+ qs = [5,4,3,2,1,0]
63
+ results = [1.4,1.3,1.3,1.3,1.3,1.3]
64
+
65
+ qs.zip(results).each do |q,result|
66
+ assert_in_delta result, SuperMemo::next_ef(q, 1.3), 0.00001, "next_ef for q=#{q}"
67
+ end
68
+ end
69
+
70
+ #-------------------------------------------------
71
+
72
+ def assert_equal_inspect(expected, actual)
73
+ assert_equal expected.inspect, actual.inspect
74
+ end
75
+
76
+ def test_traverse
77
+ assert_equal_inspect [2.5, 0, 0], SuperMemo::traverse([])
78
+ assert_equal_inspect [2.6, 1, 1], SuperMemo::traverse([5])
79
+ assert_equal_inspect [2.7, 2, 6], SuperMemo::traverse([5,5])
80
+ assert_equal_inspect [2.8, 3, 16], SuperMemo::traverse([5,5,5])
81
+ assert_equal_inspect [2.9, 4, 45], SuperMemo::traverse([5,5,5,5])
82
+ end
83
+
84
+ end
85
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jpalardy-forgetful
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Palardy
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-11-13 00:00:00 -08:00
12
+ date: 2008-11-21 00:00:00 -08:00
13
13
  default_executable: forgetful
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -35,6 +35,7 @@ extra_rdoc_files:
35
35
  - lib/csv_ext/reminder.rb
36
36
  - lib/forgetful.rb
37
37
  - lib/reminder.rb
38
+ - lib/supermemo.rb
38
39
  - README.rdoc
39
40
  files:
40
41
  - bin/forgetful
@@ -43,11 +44,13 @@ files:
43
44
  - lib/csv_ext/reminder.rb
44
45
  - lib/forgetful.rb
45
46
  - lib/reminder.rb
47
+ - lib/supermemo.rb
46
48
  - Manifest
47
49
  - MIT-LICENSE
48
50
  - README.rdoc
49
51
  - test/test_reminder.rb
50
52
  - test/test_reminder_csv.rb
53
+ - test/test_supermemo.rb
51
54
  - forgetful.gemspec
52
55
  has_rdoc: false
53
56
  homepage: http://github.com/jpalardy/forgetful
@@ -83,3 +86,4 @@ summary: A minimal command-line implementation of the SuperMemo 2 algorithm.
83
86
  test_files:
84
87
  - test/test_reminder.rb
85
88
  - test/test_reminder_csv.rb
89
+ - test/test_supermemo.rb