predictor for interest is k
This commit is contained in:
@@ -20,6 +20,8 @@ func NewInterestPredictor(namePattern string, currencyPattern string, apy float6
|
|||||||
result[k] = maps.Clone(v)
|
result[k] = maps.Clone(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
monthsPassed := float64(delta) / float64(time.Hour*24.0*365.0/12.0)
|
||||||
|
scalar := math.Pow(1.0+apy/12.0, monthsPassed)
|
||||||
for name := range result {
|
for name := range result {
|
||||||
if !nameMatcher.MatchString(name) {
|
if !nameMatcher.MatchString(name) {
|
||||||
continue
|
continue
|
||||||
@@ -28,8 +30,7 @@ func NewInterestPredictor(namePattern string, currencyPattern string, apy float6
|
|||||||
if !currencyMatcher.MatchString(string(currency)) {
|
if !currencyMatcher.MatchString(string(currency)) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
percentOfYearPassed := float64(delta) / float64(time.Hour*365)
|
result[name][currency] *= scalar
|
||||||
result[name][currency] *= math.Pow(1.0+apy/12.0, percentOfYearPassed)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestNewInterestPredictor(t *testing.T) {
|
func TestNewInterestPredictor(t *testing.T) {
|
||||||
name := "x"
|
acc := "x"
|
||||||
curr := ledger.USD
|
curr := ledger.USD
|
||||||
cases := map[string]struct {
|
cases := map[string]struct {
|
||||||
apy float64
|
apy float64
|
||||||
@@ -18,22 +18,22 @@ func TestNewInterestPredictor(t *testing.T) {
|
|||||||
}{
|
}{
|
||||||
"zero": {
|
"zero": {
|
||||||
apy: 0,
|
apy: 0,
|
||||||
given: ledger.Balances{name: ledger.Balance{curr: 100}},
|
given: ledger.Balances{acc: ledger.Balance{curr: 100}},
|
||||||
delta: time.Hour * 24 * 365,
|
delta: time.Hour * 24 * 365,
|
||||||
want: ledger.Balances{name: ledger.Balance{curr: 100}},
|
want: ledger.Balances{acc: ledger.Balance{curr: 100}},
|
||||||
},
|
},
|
||||||
"100%": {
|
"50%": {
|
||||||
apy: 1,
|
apy: .5,
|
||||||
given: ledger.Balances{name: ledger.Balance{curr: 100}},
|
given: ledger.Balances{acc: ledger.Balance{curr: 100}},
|
||||||
delta: time.Hour * 24 * 365,
|
delta: time.Hour * 24 * 365,
|
||||||
want: ledger.Balances{name: ledger.Balance{curr: 200}},
|
want: ledger.Balances{acc: ledger.Balance{curr: 163.21}},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for name, d := range cases {
|
for name, d := range cases {
|
||||||
c := d
|
c := d
|
||||||
t.Run(name, func(t *testing.T) {
|
t.Run(name, func(t *testing.T) {
|
||||||
predictor := NewInterestPredictor(name, string(curr), c.apy)
|
predictor := NewInterestPredictor(acc, string(curr), c.apy)
|
||||||
got := predictor(c.given, c.delta)
|
got := predictor(c.given, c.delta)
|
||||||
if got.Debug() != c.want.Debug() {
|
if got.Debug() != c.want.Debug() {
|
||||||
t.Errorf("want\n\t%+v, got\n\t%+v", c.want, got)
|
t.Errorf("want\n\t%+v, got\n\t%+v", c.want, got)
|
||||||
|
|||||||
Reference in New Issue
Block a user