summaryrefslogtreecommitdiff
path: root/spec/PersonalRecords_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/PersonalRecords_spec.rb')
-rw-r--r--spec/PersonalRecords_spec.rb206
1 files changed, 206 insertions, 0 deletions
diff --git a/spec/PersonalRecords_spec.rb b/spec/PersonalRecords_spec.rb
new file mode 100644
index 0000000..c23010b
--- /dev/null
+++ b/spec/PersonalRecords_spec.rb
@@ -0,0 +1,206 @@
+#!/usr/bin/env ruby -w
+# encoding: UTF-8
+#
+# = PostRunner_spec.rb -- PostRunner - Manage the data from your Garmin sport devices.
+#
+# Copyright (c) 2014, 2015, 2016 by Chris Schlaeger <cs@taskjuggler.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of version 2 of the GNU General Public License as
+# published by the Free Software Foundation.
+#
+
+require 'spec_helper'
+require 'perobs'
+
+require 'fit4ruby/FileNameCoder'
+require 'postrunner/FitFileStore'
+require 'postrunner/PersonalRecords'
+
+describe PostRunner::PersonalRecords do
+
+ class Mock_Activity < PEROBS::Object
+
+ po_attr :name, :fit_file_name
+
+ def initialize(store, name = nil)
+ super(store)
+ init_attr(:name, name)
+ init_attr(:fit_file_name, name)
+ end
+
+ end
+
+ class Mock_FitFileStore < PEROBS::Object
+
+ po_attr :activities
+
+ def initialize(store)
+ super
+ init_attr(:activities, @store.new(PEROBS::Array))
+ end
+
+ def add_activity(a)
+ @activities << a
+ end
+
+ def ref_by_activity(a)
+ @activities.index(a) + 1
+ end
+
+ end
+
+ before(:all) do
+ @log = StringIO.new
+ Fit4Ruby::Log.open(@log)
+ @work_dir = tmp_dir_name(__FILE__)
+ Dir.mkdir(@work_dir)
+
+ # Create the FitFileStore
+ @store = PEROBS::Store.new(File.join(@work_dir, 'db'))
+ @store['config'] = @store.new(PEROBS::Hash)
+ @store['config']['data_dir'] = @work_dir
+ @ffs = @store['file_store'] = @store.new(Mock_FitFileStore)
+ @records = @store['records'] = @store.new(PostRunner::PersonalRecords)
+ end
+
+ after(:all) do
+ FileUtils.rm_rf(@work_dir)
+ end
+
+ it 'should initialize properly' do
+ expect(@records.to_s).to eq('')
+ end
+
+ it 'should register a record' do
+ a = @store.new(Mock_Activity, 'Activity 1')
+ @ffs.add_activity(a)
+ t = Time.parse('2014-11-08T09:16:00')
+ expect(@records.register_result(a, 'running', 5000.0, 20 * 60,
+ t)).to be true
+ expect(@records.register_result(a, 'running', 5000.0, nil, t)).to be true
+ expect(@records.activity_records(a).length).to eq(4)
+ expect(tables_to_arrays(@records.to_s)).to eq([
+ [["5 km", "0:20:00", "4:00", "1", "Activity 1", "2014-11-08"],
+ ["Longest Distance", "5.000 km", "-", "1", "Activity 1", "2014-11-08"]],
+ [["5 km", "0:20:00", "4:00", "1", "Activity 1", "2014-11-08"],
+ ["Longest Distance", "5.000 km", "-", "1", "Activity 1", "2014-11-08"]]
+ ])
+ end
+
+ it 'should register another record' do
+ a = @store.new(Mock_Activity, 'Activity 2')
+ @ffs.add_activity(a)
+ t = Time.parse('2014-11-09T09:16:00')
+ expect(@records.register_result(a, 'running', 10000.0,
+ 42 * 60, t)).to be true
+ expect(@records.register_result(a, 'running', 10000.0,
+ nil, t)).to be true
+ expect(@records.activity_records(a).length).to eq(4)
+ expect(tables_to_arrays(@records.to_s)).to eq([
+ [["5 km", "0:20:00", "4:00", "1", "Activity 1", "2014-11-08"],
+ ["10 km", "0:42:00", "4:12", "2", "Activity 2", "2014-11-09"],
+ ["Longest Distance", "10.000 km", "-", "2", "Activity 2", "2014-11-09"]],
+ [["5 km", "0:20:00", "4:00", "1", "Activity 1", "2014-11-08"],
+ ["10 km", "0:42:00", "4:12", "2", "Activity 2", "2014-11-09"],
+ ["Longest Distance", "10.000 km", "-", "2", "Activity 2", "2014-11-09"]],
+ ])
+ end
+
+ it 'should replace an old record with a new one' do
+ a = @store.new(Mock_Activity, 'Activity 3')
+ @ffs.add_activity(a)
+ t = Time.parse('2014-11-11T09:16:00')
+ expect(@records.register_result(a, 'running', 5000.0,
+ 19 * 60, t)).to be true
+ expect(@records.activity_records(a).length).to eq (2)
+ expect(@records.activity_records(@ffs.activities[0]).length).to eq(0)
+ expect(tables_to_arrays(@records.to_s)).to eq([
+ [["5 km", "0:19:00", "3:47", "3", "Activity 3", "2014-11-11"],
+ ["10 km", "0:42:00", "4:12", "2", "Activity 2", "2014-11-09"],
+ ["Longest Distance", "10.000 km", "-", "2", "Activity 2", "2014-11-09"]],
+ [["5 km", "0:19:00", "3:47", "3", "Activity 3", "2014-11-11"],
+ ["10 km", "0:42:00", "4:12", "2", "Activity 2", "2014-11-09"],
+ ["Longest Distance", "10.000 km", "-", "2", "Activity 2", "2014-11-09"]],
+ ])
+ end
+
+ it 'should add a new table for a new year' do
+ a = @store.new(Mock_Activity, 'Activity 4')
+ @ffs.add_activity(a)
+ t = Time.parse('2015-01-01T06:00:00')
+ expect(@records.register_result(a, 'running', 5000.0,
+ 21 * 60, t)).to be true
+ expect(@records.activity_records(a).length).to eq(1)
+ expect(tables_to_arrays(@records.to_s)).to eq([
+ [["5 km", "0:19:00", "3:47", "3", "Activity 3", "2014-11-11"],
+ ["10 km", "0:42:00", "4:12", "2", "Activity 2", "2014-11-09"],
+ ["Longest Distance", "10.000 km", "-", "2", "Activity 2", "2014-11-09"]],
+ [["5 km", "0:21:00", "4:12", "4", "Activity 4", "2015-01-01"]],
+ [["5 km", "0:19:00", "3:47", "3", "Activity 3", "2014-11-11"],
+ ["10 km", "0:42:00", "4:12", "2", "Activity 2", "2014-11-09"],
+ ["Longest Distance", "10.000 km", "-", "2", "Activity 2", "2014-11-09"]],
+ ])
+ end
+
+ it 'should not add a new record for poor result' do
+ a = @store.new(Mock_Activity, 'Activity 5')
+ @ffs.add_activity(a)
+ t = Time.parse('2015-01-02T10:00:00')
+ expect(@records.register_result(a, 'running', 5000.0, 22 * 60,
+ t)).to be false
+ expect(@records.activity_records(a).length).to eq(0)
+ end
+
+ it 'should not delete a record for non-record activity' do
+ expect(@records.delete_activity(@ffs.activities[0])).to be false
+ end
+
+ it 'should delete a record for a record activity' do
+ expect(@records.delete_activity(@ffs.activities[2])).to be true
+ expect(tables_to_arrays(@records.to_s)).to eq([
+ [["10 km", "0:42:00", "4:12", "2", "Activity 2", "2014-11-09"],
+ ["Longest Distance", "10.000 km", "-", "2", "Activity 2", "2014-11-09"]],
+ [["5 km", "0:21:00", "4:12", "4", "Activity 4", "2015-01-01"]],
+ [["10 km", "0:42:00", "4:12", "2", "Activity 2", "2014-11-09"],
+ ["Longest Distance", "10.000 km", "-", "2", "Activity 2", "2014-11-09"]],
+ ])
+ end
+
+ it 'should add a new distance record' do
+ a = @store.new(Mock_Activity, 'Activity 6')
+ @ffs.add_activity(a)
+ t = Time.parse('2015-01-10T07:00:00')
+ expect(@records.register_result(a, 'running', 15000.0, nil, t)).to be true
+ expect(@records.activity_records(a).length).to eq(2)
+ expect(tables_to_arrays(@records.to_s)).to eq([
+ [ ["10 km", "0:42:00", "4:12", "2", "Activity 2", "2014-11-09"],
+ ["Longest Distance", "15.000 km", "-", "6", "Activity 6", "2015-01-10"]],
+ [["5 km", "0:21:00", "4:12", "4", "Activity 4", "2015-01-01"],
+ ["Longest Distance", "15.000 km", "-", "6", "Activity 6", "2015-01-10"]],
+ [["10 km", "0:42:00", "4:12", "2", "Activity 2", "2014-11-09"],
+ ["Longest Distance", "10.000 km", "-", "2", "Activity 2", "2014-11-09"]],
+ ])
+ end
+
+ it 'should not register a record for a bogus sport' do
+ a = @store.new(Mock_Activity, 'Activity 5')
+ @ffs.add_activity(a)
+ t = Time.parse('2015-04-01T11:11:11')
+ expect(@records.register_result(a, 'foobaring', 5000.0, 10 * 60,
+ t)).to be false
+ end
+
+ it 'should not register a record for unknown distance' do
+ a = @store.new(Mock_Activity, 'Activity 6')
+ @ffs.add_activity(a)
+ expect { @records.register_result(a, 'cycling', 42.0, 10 * 60,
+ Time.parse('2015-04-01T11:11:11'))}.to raise_error(Fit4Ruby::Error)
+ end
+
+ it 'should delete all records' do
+ @records.delete_all_records
+ expect(@records.to_s).to eq('')
+ end
+
+end