expiration date for minutebuckets

This commit is contained in:
Radu Ioan Fericean
2013-07-15 12:53:46 +03:00
parent 6f0ba9449b
commit 6d595eee2d
3 changed files with 83 additions and 4 deletions

View File

@@ -21,6 +21,7 @@ package rater
import (
"math"
"sort"
"time"
)
type MinuteBucket struct {

View File

@@ -160,14 +160,22 @@ Splits the given timespan on minute bucket's duration.
*/
func (ts *TimeSpan) SplitByMinuteBucket(mb *MinuteBucket) (newTs *TimeSpan) {
// if mb expired skip it
if !mb.ExpirationTime.IsZero() && (ts.TimeStart.Equal(mb.ExpirationTime) || ts.TimeStart.After(mb.ExpirationTime)) {
if !mb.ExpirationDate.IsZero() && (ts.TimeStart.Equal(mb.ExpirationDate) || ts.TimeStart.After(mb.ExpirationDate)) {
return nil
}
// expiring before time spans end
if !mb.ExpirationDate.IsZero() && ts.TimeEnd.After(mb.ExpirationDate) {
newTs = &TimeSpan{TimeStart: mb.ExpirationDate, TimeEnd: ts.TimeEnd}
ts.TimeEnd = mb.ExpirationDate
}
s := ts.GetDuration().Seconds()
ts.MinuteInfo = &MinuteInfo{mb.DestinationId, s, mb.Price}
if s <= mb.Seconds {
mb.Seconds -= s
return nil
return newTs
}
secDuration, _ := time.ParseDuration(fmt.Sprintf("%vs", mb.Seconds))

View File

@@ -249,13 +249,83 @@ func TestTimespanSplitByMinuteBucketScarce(t *testing.T) {
func TestTimespanSplitByMinuteBucketPlantyExpired(t *testing.T) {
t1 := time.Date(2013, time.July, 15, 10, 40, 0, 0, time.UTC)
t2 := time.Date(2013, time.July, 15, 10, 42, 0, 0, time.UTC)
mb := &MinuteBucket{Seconds: 180, ExpirationDate: time.Date(2013, time.July, 15, 10, 40, 0, 0, time.UTC)}
mb := &MinuteBucket{Seconds: 180, ExpirationDate: time.Date(2013, time.July, 15, 10, 39, 0, 0, time.UTC)}
ts := TimeSpan{TimeStart: t1, TimeEnd: t2}
newTs := ts.SplitByMinuteBucket(mb)
if ts.MinuteInfo == nil || ts.MinuteInfo.Quantity != 120 {
if ts.MinuteInfo != nil {
t.Error("Not enough minutes on minute bucket split")
}
if newTs != nil {
t.Error("Bad extra timespan on minute bucket split")
}
}
func TestTimespanSplitByMinuteBucketPlantyExpiring(t *testing.T) {
t1 := time.Date(2013, time.July, 15, 10, 40, 0, 0, time.UTC)
t2 := time.Date(2013, time.July, 15, 10, 42, 0, 0, time.UTC)
mb := &MinuteBucket{Seconds: 180, ExpirationDate: time.Date(2013, time.July, 15, 10, 41, 0, 0, time.UTC)}
ts := TimeSpan{TimeStart: t1, TimeEnd: t2}
newTs := ts.SplitByMinuteBucket(mb)
if ts.MinuteInfo == nil || ts.MinuteInfo.Quantity != 60 {
t.Error("Not enough minutes on minute bucket split")
}
if newTs == nil || newTs.MinuteInfo != nil {
t.Error("Missing extra timespan on minute bucket split")
}
}
func TestTimespanSplitByMinuteBucketPlantyExpiringEnd(t *testing.T) {
t1 := time.Date(2013, time.July, 15, 10, 40, 0, 0, time.UTC)
t2 := time.Date(2013, time.July, 15, 10, 42, 0, 0, time.UTC)
mb := &MinuteBucket{Seconds: 180, ExpirationDate: time.Date(2013, time.July, 15, 10, 42, 0, 0, time.UTC)}
ts := TimeSpan{TimeStart: t1, TimeEnd: t2}
newTs := ts.SplitByMinuteBucket(mb)
if ts.MinuteInfo == nil || ts.MinuteInfo.Quantity != 120 {
t.Error("Not enough minutes on minute bucket split")
}
if newTs != nil {
t.Error("Missing extra timespan on minute bucket split")
}
}
func TestTimespanSplitByMinuteBucketScarceExpiringSame(t *testing.T) {
t1 := time.Date(2013, time.July, 15, 10, 40, 0, 0, time.UTC)
t2 := time.Date(2013, time.July, 15, 10, 42, 0, 0, time.UTC)
mb := &MinuteBucket{Seconds: 120, ExpirationDate: time.Date(2013, time.July, 15, 10, 41, 0, 0, time.UTC)}
ts := TimeSpan{TimeStart: t1, TimeEnd: t2}
newTs := ts.SplitByMinuteBucket(mb)
if ts.MinuteInfo == nil || ts.MinuteInfo.Quantity != 60 {
t.Error("Not enough minutes on minute bucket split")
}
if newTs == nil || newTs.MinuteInfo != nil {
t.Error("Missing extra timespan on minute bucket split")
}
}
func TestTimespanSplitByMinuteBucketScarceExpiringDifferentExpFirst(t *testing.T) {
t1 := time.Date(2013, time.July, 15, 10, 40, 0, 0, time.UTC)
t2 := time.Date(2013, time.July, 15, 10, 42, 0, 0, time.UTC)
mb := &MinuteBucket{Seconds: 140, ExpirationDate: time.Date(2013, time.July, 15, 10, 41, 1, 0, time.UTC)}
ts := TimeSpan{TimeStart: t1, TimeEnd: t2}
newTs := ts.SplitByMinuteBucket(mb)
if ts.MinuteInfo == nil || ts.MinuteInfo.Quantity != 61 {
t.Error("Not enough minutes on minute bucket split: ", ts.MinuteInfo.Quantity)
}
if newTs == nil || newTs.MinuteInfo != nil {
t.Error("Missing extra timespan on minute bucket split")
}
}
func TestTimespanSplitByMinuteBucketScarceExpiringDifferentScarceFirst(t *testing.T) {
t1 := time.Date(2013, time.July, 15, 10, 40, 0, 0, time.UTC)
t2 := time.Date(2013, time.July, 15, 10, 42, 0, 0, time.UTC)
mb := &MinuteBucket{Seconds: 61, ExpirationDate: time.Date(2013, time.July, 15, 10, 41, 30, 0, time.UTC)}
ts := TimeSpan{TimeStart: t1, TimeEnd: t2}
newTs := ts.SplitByMinuteBucket(mb)
if ts.MinuteInfo == nil || ts.MinuteInfo.Quantity != 61 {
t.Error("Not enough minutes on minute bucket split")
}
if newTs == nil || newTs.MinuteInfo != nil {
t.Error("Missing extra timespan on minute bucket split")
}
}