jpalardy-forgetful 0.0.6 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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