diff --git a/pkg/schet/celi.go b/pkg/schet/celi.go index 75c0aba..bad1d73 100644 --- a/pkg/schet/celi.go +++ b/pkg/schet/celi.go @@ -4,6 +4,17 @@ import ( "errors" ) +const ( + ЦельОПС = "ОПС" + Цель1пр = "1пр" + ЦельУСН = "УСН" +) + +var ( + ErrНеизвестныйКвартал = errors.New("неизвестный квартал") + ErrНеизвестнаяЦель = errors.New("неизвестная цель") +) + type Цели struct { год *Год Кварталы []*Квартал @@ -17,7 +28,7 @@ func NewЦели(год *Год) *Цели { } func (c *Цели) Квартал(in int) (k *Квартал, e error) { - e = errors.New("неизвестный квартал") + e = ErrНеизвестныйКвартал if in < НомерПервогоКвартала || in > НомерПоследнегоКвартала { return diff --git a/pkg/schet/features/app.feature b/pkg/schet/features/app.feature index e7ff2e0..a1369ce 100644 --- a/pkg/schet/features/app.feature +++ b/pkg/schet/features/app.feature @@ -5,7 +5,6 @@ Сценарий: Платёж по ОПС в квартале Дано Год: 2024 Дано Квартал: <квартал> - Когда Расчитать год То Есть цель: ОПС за этот квартал: 12375 Примеры: @@ -19,7 +18,6 @@ Дано Год: 2024 Дано Квартал: 1 Дано Доход: <доход> - Когда Расчитать год То Есть цель: 1% сверх 300тр за квартал: "<оплатить_за_квартал>" То Есть цель: 1% сверх 300тр за год: "<оплатить_за_год>" @@ -42,7 +40,6 @@ Дано Доход <доход2> за 2 квартал Дано Доход <доход3> за 3 квартал Дано Доход <доход4> за 4 квартал - Когда Расчитать год То Есть цель: 1% сверх 300тр за 1 квартал: "<оплатить1>" То Есть цель: 1% сверх 300тр за 2 квартал: "<оплатить2>" То Есть цель: 1% сверх 300тр за 3 квартал: "<оплатить3>" @@ -71,7 +68,6 @@ Дано Год: 2024 Дано Квартал: <квартал> Дано Доход: 500000 - Когда Расчитать год То Есть цель: УСН за этот квартал: 20000 Примеры: @@ -87,7 +83,6 @@ Дано Доход 100000 за 1 квартал Дано Доход 200000 за 1 квартал Дано Доход 400000 за 2 квартал - Когда Расчитать год То Доход в квартал: 300000 То Доход в год: 700000 @@ -95,3 +90,47 @@ Дано Год: 2024 Когда Задан счёт "123" То Считывается счёт "123" + + Сценарий: Достижение целей: неизвестная - ошибка + Дано Год: 2024 + Дано Должна быть ошибка + Когда Действие: "неизвестная" за 1 квартал + + Сценарий: Достижение целей: ОПС + Дано Год: 2024 + * Цель "ОПС" за 1 квартал достигнута: "-" + * Цель "1пр" за 1 квартал достигнута: "-" + * Цель "УСН" за 1 квартал достигнута: "-" + Когда Действие: "ОПС" за 1 квартал + То Цель "ОПС" за 1 квартал достигнута: "+" + То Цель "ОПС" за 2 квартал достигнута: "-" + То Цель "ОПС" за 3 квартал достигнута: "-" + То Цель "ОПС" за 4 квартал достигнута: "-" + То Цель "1пр" за 1 квартал достигнута: "-" + То Цель "УСН" за 1 квартал достигнута: "-" + + Сценарий: Достижение целей: 1пр сверх 300тр + Дано Год: 2024 + * Цель "ОПС" за 1 квартал достигнута: "-" + * Цель "1пр" за 1 квартал достигнута: "-" + * Цель "УСН" за 1 квартал достигнута: "-" + Когда Действие: "1пр" за 1 квартал + То Цель "ОПС" за 1 квартал достигнута: "-" + То Цель "1пр" за 1 квартал достигнута: "+" + То Цель "1пр" за 2 квартал достигнута: "-" + То Цель "1пр" за 3 квартал достигнута: "-" + То Цель "1пр" за 4 квартал достигнута: "-" + То Цель "УСН" за 1 квартал достигнута: "-" + + Сценарий: Достижение целей: УСН + Дано Год: 2024 + * Цель "ОПС" за 1 квартал достигнута: "-" + * Цель "1пр" за 1 квартал достигнута: "-" + * Цель "УСН" за 1 квартал достигнута: "-" + Когда Действие: "УСН" за 1 квартал + То Цель "ОПС" за 1 квартал достигнута: "-" + То Цель "1пр" за 1 квартал достигнута: "-" + То Цель "УСН" за 1 квартал достигнута: "+" + То Цель "УСН" за 2 квартал достигнута: "-" + То Цель "УСН" за 3 квартал достигнута: "-" + То Цель "УСН" за 4 квартал достигнута: "-" diff --git a/pkg/schet/init_test.go b/pkg/schet/init_test.go index 363cc62..652e553 100644 --- a/pkg/schet/init_test.go +++ b/pkg/schet/init_test.go @@ -20,7 +20,6 @@ func InitializeScenario(ctx *godog.ScenarioContext) { ctx.Step(`^Доход (\d+) за (\d+) квартал$`, доходЗаКвартал) ctx.Step(`^Доход в квартал: (\d+)$`, доходВКвартал) ctx.Step(`^Доход в год: (\d+)$`, доходВГод) - ctx.Step(`^Расчитать год$`, расчитатьГод) ctx.Step(`^Есть цель: ОПС за этот квартал: (\d+)$`, естьЦельОПСЗаЭтотКвартал) ctx.Step(`^Есть цель: УСН за этот квартал: (\d+)$`, естьЦельУСНЗаЭтотКвартал) ctx.Step(`^Есть цель: (\d+)% сверх (\d+)тр за квартал: "([^"]*)"$`, естьЦельСверхТрЗаКвартал) @@ -28,7 +27,9 @@ func InitializeScenario(ctx *godog.ScenarioContext) { ctx.Step(`^Есть цель: (\d+)% сверх (\d+)тр за год: "([^"]*)"$`, естьЦельСверхТрЗаГод) ctx.Step(`^Задан счёт "([^"]*)"$`, заданСчёт) ctx.Step(`^Считывается счёт "([^"]*)"$`, считываетсяСчёт) - + ctx.Step(`^Должна быть ошибка$`, должнаБытьОшибка) + ctx.Step(`^Действие: "([^"]*)" за (\d+) квартал$`, действиеЗаКвартал) + ctx.Step(`^Цель "([^"]*)" за (\d+) квартал достигнута: "([^"]*)"$`, цельЗаКварталДостигнута) // ----------------------- ctx.Before(func(ctx context.Context, sc *godog.Scenario) (context.Context, error) { beforeScenario() diff --git a/pkg/schet/kvartal.go b/pkg/schet/kvartal.go index eff63e0..0e948e4 100644 --- a/pkg/schet/kvartal.go +++ b/pkg/schet/kvartal.go @@ -5,11 +5,12 @@ import ( ) type Квартал struct { - номер int - год *Год - доход float64 - ОПС *ОПС_type - УСН *УСН_type + номер int + год *Год + доход float64 + ОПС *ОПС_type + УСН *УСН_type + сверх300тр1пр bool } func NewКвартал(номер int, год *Год) *Квартал { @@ -47,3 +48,27 @@ func (k *Квартал) ПроцентСверх300тр() (float64, error) { return процентСуммы(сумма), nil } + +func (k *Квартал) Сделать(цель string) error { + switch цель { + case ЦельОПС: + return k.ОПС.Сделать() + case Цель1пр: + k.сверх300тр1пр = true + return nil + case ЦельУСН: + return k.УСН.Сделать() + } + return ErrНеизвестнаяЦель +} +func (k *Квартал) ЦельДостигнута(цель string) bool { + switch цель { + case ЦельОПС: + return k.ОПС.Сделано() + case Цель1пр: + return k.сверх300тр1пр + case ЦельУСН: + return k.УСН.Сделано() + } + return false +} diff --git a/pkg/schet/ops.go b/pkg/schet/ops.go index 71b746b..c0ed3b2 100644 --- a/pkg/schet/ops.go +++ b/pkg/schet/ops.go @@ -3,6 +3,7 @@ package schet type ОПС_type struct { квартал *Квартал сумма float64 + сделано bool } func NewОПС_type(квартал *Квартал) *ОПС_type { @@ -16,3 +17,11 @@ func NewОПС_type(квартал *Квартал) *ОПС_type { func (o *ОПС_type) Сумма() float64 { return o.сумма } + +func (o *ОПС_type) Сделать() error { + o.сделано = true + return nil +} +func (o *ОПС_type) Сделано() bool { + return o.сделано +} diff --git a/pkg/schet/schet.go b/pkg/schet/schet.go index a9abe21..22f183c 100644 --- a/pkg/schet/schet.go +++ b/pkg/schet/schet.go @@ -45,6 +45,23 @@ func (g *Год) Счёт() string { return g.счёт } +func (g *Год) Сделать(цель string, квартал int) error { + k, err := g.Квартал(квартал) + if err != nil { + return err + } + + return k.Сделать(цель) +} +func (g *Год) ЦельДостигнута(цель string, квартал int) bool { + k, err := g.Квартал(квартал) + if err != nil { + return false + } + + return k.ЦельДостигнута(цель) +} + func (g *Год) Квартал(in int) (k *Квартал, e error) { return g.цели.Квартал(in) } diff --git a/pkg/schet/schet_test.go b/pkg/schet/schet_test.go index c6301f5..552f71a 100644 --- a/pkg/schet/schet_test.go +++ b/pkg/schet/schet_test.go @@ -8,12 +8,13 @@ import ( ) type testData struct { - g *Год - год_номер int - квартал_номер int - квартал *Квартал - доход float64 - цели *Цели + g *Год + год_номер int + квартал_номер int + квартал *Квартал + доход float64 + цели *Цели + должнаБытьОшибка bool } var ( @@ -67,8 +68,6 @@ func доходВГод(доход float64) { Ω(t.g.Доход()).To(Be(доход), "доходВГод") } -func расчитатьГод() {} - func естьЦельОПСЗаЭтотКвартал(v float64) { Ω(t.квартал.ОПС.Сумма()).To(Be(v), "ОПС за квартал") } @@ -96,3 +95,18 @@ func заданСчёт(v string) { func считываетсяСчёт(v string) { Ω(t.g.Счёт()).To(Be(v), "считываетсяСчёт") } +func должнаБытьОшибка() { + t.должнаБытьОшибка = true +} + +func действиеЗаКвартал(цель string, квартал int) { + err := t.g.Сделать(цель, квартал) + if t.должнаБытьОшибка { + Err(err) + } else { + Ok(err) + } +} +func цельЗаКварталДостигнута(цель string, квартал int, достигнута string) { + Ω(t.g.ЦельДостигнута(цель, квартал)).To(Be(Истина(достигнута)), "цельЗаКварталДостигнута: "+цель) +} diff --git a/pkg/schet/summator300tr.go b/pkg/schet/summator300tr.go index 550fa85..7b556f6 100644 --- a/pkg/schet/summator300tr.go +++ b/pkg/schet/summator300tr.go @@ -1,7 +1,5 @@ package schet -import "errors" - const ( Сумма300тр = 300000 ) @@ -18,7 +16,7 @@ func NewСумматор300тр() *Сумматор300тр { func (s *Сумматор300тр) Квартал(номер int) (float64, error) { index := номер - 1 if index >= len(s.сверхСуммы) || index < 0 { - return 0, errors.New("неизвестный квартал") + return 0, ErrНеизвестныйКвартал } return s.сверхСуммы[index], nil } diff --git a/pkg/schet/ucn.go b/pkg/schet/ucn.go index e92656f..b9c0d4a 100644 --- a/pkg/schet/ucn.go +++ b/pkg/schet/ucn.go @@ -2,6 +2,7 @@ package schet type УСН_type struct { квартал *Квартал + сделано bool } func NewУСН_type(квартал *Квартал) *УСН_type { @@ -16,3 +17,11 @@ func (o *УСН_type) Сумма() float64 { procent := d / 100. return 4 * procent } + +func (o *УСН_type) Сделать() error { + o.сделано = true + return nil +} +func (o *УСН_type) Сделано() bool { + return o.сделано +} diff --git a/pkg/testlib/testlib.go b/pkg/testlib/testlib.go index 6d2c5dc..f4d0d7e 100644 --- a/pkg/testlib/testlib.go +++ b/pkg/testlib/testlib.go @@ -2,6 +2,7 @@ package testlib import ( "context" + "errors" "fmt" "strconv" "time" @@ -18,6 +19,16 @@ func NoErr(err error) { var Ok = NoErr +func Err(err error) { + ExpectWithOffset(1, err).To(HaveOccurred()) +} +func ErrIs(err, target error) { + ExpectWithOffset(1, err).To(HaveOccurred()) + v := errors.Is(err, target) + s := fmt.Sprintf("ErrIs: '%v' != '%v'", err, target) + ExpectWithOffset(1, v).To(BeTrue(), s) +} + func Yes(b bool) { ExpectWithOffset(1, b).To(BeTrue()) } @@ -36,6 +47,14 @@ func Atof(in string) float64 { return res } +func Истина(in string) bool { + switch in { + case "t", "true", "+", "да": + return true + } + return false +} + var TestResult error func InitializeGomegaForGodog(ctx *godog.ScenarioContext) {