Сценарий: Достижение целей - пометка сделанного
Этот коммит содержится в:
родитель
e7ed7658bb
коммит
9f5a468141
10 изменённых файлов: 166 добавлений и 24 удалений
|
@ -4,6 +4,17 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
ЦельОПС = "ОПС"
|
||||||
|
Цель1пр = "1пр"
|
||||||
|
ЦельУСН = "УСН"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
ErrНеизвестныйКвартал = errors.New("неизвестный квартал")
|
||||||
|
ErrНеизвестнаяЦель = errors.New("неизвестная цель")
|
||||||
|
)
|
||||||
|
|
||||||
type Цели struct {
|
type Цели struct {
|
||||||
год *Год
|
год *Год
|
||||||
Кварталы []*Квартал
|
Кварталы []*Квартал
|
||||||
|
@ -17,7 +28,7 @@ func NewЦели(год *Год) *Цели {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Цели) Квартал(in int) (k *Квартал, e error) {
|
func (c *Цели) Квартал(in int) (k *Квартал, e error) {
|
||||||
e = errors.New("неизвестный квартал")
|
e = ErrНеизвестныйКвартал
|
||||||
|
|
||||||
if in < НомерПервогоКвартала || in > НомерПоследнегоКвартала {
|
if in < НомерПервогоКвартала || in > НомерПоследнегоКвартала {
|
||||||
return
|
return
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
Сценарий: Платёж по ОПС в квартале
|
Сценарий: Платёж по ОПС в квартале
|
||||||
Дано Год: 2024
|
Дано Год: 2024
|
||||||
Дано Квартал: <квартал>
|
Дано Квартал: <квартал>
|
||||||
Когда Расчитать год
|
|
||||||
То Есть цель: ОПС за этот квартал: 12375
|
То Есть цель: ОПС за этот квартал: 12375
|
||||||
|
|
||||||
Примеры:
|
Примеры:
|
||||||
|
@ -19,7 +18,6 @@
|
||||||
Дано Год: 2024
|
Дано Год: 2024
|
||||||
Дано Квартал: 1
|
Дано Квартал: 1
|
||||||
Дано Доход: <доход>
|
Дано Доход: <доход>
|
||||||
Когда Расчитать год
|
|
||||||
То Есть цель: 1% сверх 300тр за квартал: "<оплатить_за_квартал>"
|
То Есть цель: 1% сверх 300тр за квартал: "<оплатить_за_квартал>"
|
||||||
То Есть цель: 1% сверх 300тр за год: "<оплатить_за_год>"
|
То Есть цель: 1% сверх 300тр за год: "<оплатить_за_год>"
|
||||||
|
|
||||||
|
@ -42,7 +40,6 @@
|
||||||
Дано Доход <доход2> за 2 квартал
|
Дано Доход <доход2> за 2 квартал
|
||||||
Дано Доход <доход3> за 3 квартал
|
Дано Доход <доход3> за 3 квартал
|
||||||
Дано Доход <доход4> за 4 квартал
|
Дано Доход <доход4> за 4 квартал
|
||||||
Когда Расчитать год
|
|
||||||
То Есть цель: 1% сверх 300тр за 1 квартал: "<оплатить1>"
|
То Есть цель: 1% сверх 300тр за 1 квартал: "<оплатить1>"
|
||||||
То Есть цель: 1% сверх 300тр за 2 квартал: "<оплатить2>"
|
То Есть цель: 1% сверх 300тр за 2 квартал: "<оплатить2>"
|
||||||
То Есть цель: 1% сверх 300тр за 3 квартал: "<оплатить3>"
|
То Есть цель: 1% сверх 300тр за 3 квартал: "<оплатить3>"
|
||||||
|
@ -71,7 +68,6 @@
|
||||||
Дано Год: 2024
|
Дано Год: 2024
|
||||||
Дано Квартал: <квартал>
|
Дано Квартал: <квартал>
|
||||||
Дано Доход: 500000
|
Дано Доход: 500000
|
||||||
Когда Расчитать год
|
|
||||||
То Есть цель: УСН за этот квартал: 20000
|
То Есть цель: УСН за этот квартал: 20000
|
||||||
|
|
||||||
Примеры:
|
Примеры:
|
||||||
|
@ -87,7 +83,6 @@
|
||||||
Дано Доход 100000 за 1 квартал
|
Дано Доход 100000 за 1 квартал
|
||||||
Дано Доход 200000 за 1 квартал
|
Дано Доход 200000 за 1 квартал
|
||||||
Дано Доход 400000 за 2 квартал
|
Дано Доход 400000 за 2 квартал
|
||||||
Когда Расчитать год
|
|
||||||
То Доход в квартал: 300000
|
То Доход в квартал: 300000
|
||||||
То Доход в год: 700000
|
То Доход в год: 700000
|
||||||
|
|
||||||
|
@ -95,3 +90,47 @@
|
||||||
Дано Год: 2024
|
Дано Год: 2024
|
||||||
Когда Задан счёт "123"
|
Когда Задан счёт "123"
|
||||||
То Считывается счёт "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 квартал достигнута: "-"
|
||||||
|
|
|
@ -20,7 +20,6 @@ func InitializeScenario(ctx *godog.ScenarioContext) {
|
||||||
ctx.Step(`^Доход (\d+) за (\d+) квартал$`, доходЗаКвартал)
|
ctx.Step(`^Доход (\d+) за (\d+) квартал$`, доходЗаКвартал)
|
||||||
ctx.Step(`^Доход в квартал: (\d+)$`, доходВКвартал)
|
ctx.Step(`^Доход в квартал: (\d+)$`, доходВКвартал)
|
||||||
ctx.Step(`^Доход в год: (\d+)$`, доходВГод)
|
ctx.Step(`^Доход в год: (\d+)$`, доходВГод)
|
||||||
ctx.Step(`^Расчитать год$`, расчитатьГод)
|
|
||||||
ctx.Step(`^Есть цель: ОПС за этот квартал: (\d+)$`, естьЦельОПСЗаЭтотКвартал)
|
ctx.Step(`^Есть цель: ОПС за этот квартал: (\d+)$`, естьЦельОПСЗаЭтотКвартал)
|
||||||
ctx.Step(`^Есть цель: УСН за этот квартал: (\d+)$`, естьЦельУСНЗаЭтотКвартал)
|
ctx.Step(`^Есть цель: УСН за этот квартал: (\d+)$`, естьЦельУСНЗаЭтотКвартал)
|
||||||
ctx.Step(`^Есть цель: (\d+)% сверх (\d+)тр за квартал: "([^"]*)"$`, естьЦельСверхТрЗаКвартал)
|
ctx.Step(`^Есть цель: (\d+)% сверх (\d+)тр за квартал: "([^"]*)"$`, естьЦельСверхТрЗаКвартал)
|
||||||
|
@ -28,7 +27,9 @@ func InitializeScenario(ctx *godog.ScenarioContext) {
|
||||||
ctx.Step(`^Есть цель: (\d+)% сверх (\d+)тр за год: "([^"]*)"$`, естьЦельСверхТрЗаГод)
|
ctx.Step(`^Есть цель: (\d+)% сверх (\d+)тр за год: "([^"]*)"$`, естьЦельСверхТрЗаГод)
|
||||||
ctx.Step(`^Задан счёт "([^"]*)"$`, заданСчёт)
|
ctx.Step(`^Задан счёт "([^"]*)"$`, заданСчёт)
|
||||||
ctx.Step(`^Считывается счёт "([^"]*)"$`, считываетсяСчёт)
|
ctx.Step(`^Считывается счёт "([^"]*)"$`, считываетсяСчёт)
|
||||||
|
ctx.Step(`^Должна быть ошибка$`, должнаБытьОшибка)
|
||||||
|
ctx.Step(`^Действие: "([^"]*)" за (\d+) квартал$`, действиеЗаКвартал)
|
||||||
|
ctx.Step(`^Цель "([^"]*)" за (\d+) квартал достигнута: "([^"]*)"$`, цельЗаКварталДостигнута)
|
||||||
// -----------------------
|
// -----------------------
|
||||||
ctx.Before(func(ctx context.Context, sc *godog.Scenario) (context.Context, error) {
|
ctx.Before(func(ctx context.Context, sc *godog.Scenario) (context.Context, error) {
|
||||||
beforeScenario()
|
beforeScenario()
|
||||||
|
|
|
@ -5,11 +5,12 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type Квартал struct {
|
type Квартал struct {
|
||||||
номер int
|
номер int
|
||||||
год *Год
|
год *Год
|
||||||
доход float64
|
доход float64
|
||||||
ОПС *ОПС_type
|
ОПС *ОПС_type
|
||||||
УСН *УСН_type
|
УСН *УСН_type
|
||||||
|
сверх300тр1пр bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewКвартал(номер int, год *Год) *Квартал {
|
func NewКвартал(номер int, год *Год) *Квартал {
|
||||||
|
@ -47,3 +48,27 @@ func (k *Квартал) ПроцентСверх300тр() (float64, error) {
|
||||||
|
|
||||||
return процентСуммы(сумма), nil
|
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
|
||||||
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package schet
|
||||||
type ОПС_type struct {
|
type ОПС_type struct {
|
||||||
квартал *Квартал
|
квартал *Квартал
|
||||||
сумма float64
|
сумма float64
|
||||||
|
сделано bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewОПС_type(квартал *Квартал) *ОПС_type {
|
func NewОПС_type(квартал *Квартал) *ОПС_type {
|
||||||
|
@ -16,3 +17,11 @@ func NewОПС_type(квартал *Квартал) *ОПС_type {
|
||||||
func (o *ОПС_type) Сумма() float64 {
|
func (o *ОПС_type) Сумма() float64 {
|
||||||
return o.сумма
|
return o.сумма
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (o *ОПС_type) Сделать() error {
|
||||||
|
o.сделано = true
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func (o *ОПС_type) Сделано() bool {
|
||||||
|
return o.сделано
|
||||||
|
}
|
||||||
|
|
|
@ -45,6 +45,23 @@ func (g *Год) Счёт() string {
|
||||||
return g.счёт
|
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) {
|
func (g *Год) Квартал(in int) (k *Квартал, e error) {
|
||||||
return g.цели.Квартал(in)
|
return g.цели.Квартал(in)
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,12 +8,13 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type testData struct {
|
type testData struct {
|
||||||
g *Год
|
g *Год
|
||||||
год_номер int
|
год_номер int
|
||||||
квартал_номер int
|
квартал_номер int
|
||||||
квартал *Квартал
|
квартал *Квартал
|
||||||
доход float64
|
доход float64
|
||||||
цели *Цели
|
цели *Цели
|
||||||
|
должнаБытьОшибка bool
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -67,8 +68,6 @@ func доходВГод(доход float64) {
|
||||||
Ω(t.g.Доход()).To(Be(доход), "доходВГод")
|
Ω(t.g.Доход()).To(Be(доход), "доходВГод")
|
||||||
}
|
}
|
||||||
|
|
||||||
func расчитатьГод() {}
|
|
||||||
|
|
||||||
func естьЦельОПСЗаЭтотКвартал(v float64) {
|
func естьЦельОПСЗаЭтотКвартал(v float64) {
|
||||||
Ω(t.квартал.ОПС.Сумма()).To(Be(v), "ОПС за квартал")
|
Ω(t.квартал.ОПС.Сумма()).To(Be(v), "ОПС за квартал")
|
||||||
}
|
}
|
||||||
|
@ -96,3 +95,18 @@ func заданСчёт(v string) {
|
||||||
func считываетсяСчёт(v string) {
|
func считываетсяСчёт(v string) {
|
||||||
Ω(t.g.Счёт()).To(Be(v), "считываетсяСчёт")
|
Ω(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(Истина(достигнута)), "цельЗаКварталДостигнута: "+цель)
|
||||||
|
}
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
package schet
|
package schet
|
||||||
|
|
||||||
import "errors"
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
Сумма300тр = 300000
|
Сумма300тр = 300000
|
||||||
)
|
)
|
||||||
|
@ -18,7 +16,7 @@ func NewСумматор300тр() *Сумматор300тр {
|
||||||
func (s *Сумматор300тр) Квартал(номер int) (float64, error) {
|
func (s *Сумматор300тр) Квартал(номер int) (float64, error) {
|
||||||
index := номер - 1
|
index := номер - 1
|
||||||
if index >= len(s.сверхСуммы) || index < 0 {
|
if index >= len(s.сверхСуммы) || index < 0 {
|
||||||
return 0, errors.New("неизвестный квартал")
|
return 0, ErrНеизвестныйКвартал
|
||||||
}
|
}
|
||||||
return s.сверхСуммы[index], nil
|
return s.сверхСуммы[index], nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ package schet
|
||||||
|
|
||||||
type УСН_type struct {
|
type УСН_type struct {
|
||||||
квартал *Квартал
|
квартал *Квартал
|
||||||
|
сделано bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewУСН_type(квартал *Квартал) *УСН_type {
|
func NewУСН_type(квартал *Квартал) *УСН_type {
|
||||||
|
@ -16,3 +17,11 @@ func (o *УСН_type) Сумма() float64 {
|
||||||
procent := d / 100.
|
procent := d / 100.
|
||||||
return 4 * procent
|
return 4 * procent
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (o *УСН_type) Сделать() error {
|
||||||
|
o.сделано = true
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func (o *УСН_type) Сделано() bool {
|
||||||
|
return o.сделано
|
||||||
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ package testlib
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
@ -18,6 +19,16 @@ func NoErr(err error) {
|
||||||
|
|
||||||
var Ok = NoErr
|
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) {
|
func Yes(b bool) {
|
||||||
ExpectWithOffset(1, b).To(BeTrue())
|
ExpectWithOffset(1, b).To(BeTrue())
|
||||||
}
|
}
|
||||||
|
@ -36,6 +47,14 @@ func Atof(in string) float64 {
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Истина(in string) bool {
|
||||||
|
switch in {
|
||||||
|
case "t", "true", "+", "да":
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
var TestResult error
|
var TestResult error
|
||||||
|
|
||||||
func InitializeGomegaForGodog(ctx *godog.ScenarioContext) {
|
func InitializeGomegaForGodog(ctx *godog.ScenarioContext) {
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче