Skip to content

Commit

Permalink
Initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
ktxr authored Aug 12, 2024
0 parents commit a210825
Show file tree
Hide file tree
Showing 5 changed files with 347 additions and 0 deletions.
32 changes: 32 additions & 0 deletions .github/workflows/autotest.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: autotests

on:
pull_request:
push:
branches:
- main

jobs:

ftrackertest:
runs-on: ubuntu-latest
container: golang:1.21

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Checkout tests code
uses: actions/checkout@v4
with:
repository: 'Yandex-Practicum/go-autotests'
path: '.autotests'

- name: Gather files
run: |
cp .autotests/cmd/fitnesstest/main_test.go main_test.go
- name: Run tests
run: |
go mod tidy
go test -test.v ./...
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Ура! Вы добрались до финального проекта спринта. Это ваш первый проект, который вы отправите на проверку через Git. Прежде чем приступить к выполнению задачи, изучите технические подробности.
138 changes: 138 additions & 0 deletions ftracker.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
package ftracker

import (
"fmt"
"math"
)

// Основные константы, необходимые для расчетов.
const (
lenStep = 0.65 // средняя длина шага.
mInKm = 1000 // количество метров в километре.
minInH = 60 // количество минут в часе.
kmhInMsec = 0.278 // коэффициент для преобразования км/ч в м/с.
cmInM = 100 // количество сантиметров в метре.
)

// distance возвращает дистанцию(в километрах), которую преодолел пользователь за время тренировки.
//
// Параметры:
//
// action int — количество совершенных действий (число шагов при ходьбе и беге, либо гребков при плавании).
func distance(action int) float64 {
return float64(action) * lenStep / mInKm
}

// meanSpeed возвращает значение средней скорости движения во время тренировки.
//
// Параметры:
//
// action int — количество совершенных действий(число шагов при ходьбе и беге, либо гребков при плавании).
// duration float64 — длительность тренировки в часах.
func meanSpeed(action int, duration float64) float64 {
if duration == 0 {
return 0
}
distance := distance(action)
return distance / duration
}

// ShowTrainingInfo возвращает строку с информацией о тренировке.
//
// Параметры:
//
// action int — количество совершенных действий(число шагов при ходьбе и беге, либо гребков при плавании).
// trainingType string — вид тренировки(Бег, Ходьба, Плавание).
// duration float64 — длительность тренировки в часах.
func ShowTrainingInfo(action int, trainingType string, duration, weight, height float64, lengthPool, countPool int) string {
// ваш код здесь
switch {
case trainingType == "Бег":
distance := ... // вызовите здесь необходимую функцию
speed := ... // вызовите здесь необходимую функцию
calories := ... // вызовите здесь необходимую функцию
return fmt.Sprintf("Тип тренировки: %s\nДлительность: %.2f ч.\nДистанция: %.2f км.\nСкорость: %.2f км/ч\nСожгли калорий: %.2f\n", trainingType, duration, distance, speed, calories)
case trainingType == "Ходьба":
distance := ... // вызовите здесь необходимую функцию
speed := ... // вызовите здесь необходимую функцию
calories := ... // вызовите здесь необходимую функцию
return fmt.Sprintf("Тип тренировки: %s\nДлительность: %.2f ч.\nДистанция: %.2f км.\nСкорость: %.2f км/ч\nСожгли калорий: %.2f\n", trainingType, duration, distance, speed, calories)
case trainingType == "Плавание":
distance := ... // вызовите здесь необходимую функцию
speed := ... // вызовите здесь необходимую функцию
calories := ... // вызовите здесь необходимую функцию
return fmt.Sprintf("Тип тренировки: %s\nДлительность: %.2f ч.\nДистанция: %.2f км.\nСкорость: %.2f км/ч\nСожгли калорий: %.2f\n", trainingType, duration, distance, speed, calories)
default:
return "неизвестный тип тренировки"
}
}

// Константы для расчета калорий, расходуемых при беге.
const (
runningCaloriesMeanSpeedMultiplier = 18 // множитель средней скорости.
runningCaloriesMeanSpeedShift = 1.79 // среднее количество сжигаемых калорий при беге.
)

// RunningSpentCalories возвращает количество потраченных колорий при беге.
//
// Параметры:
//
// action int — количество совершенных действий(число шагов при ходьбе и беге, либо гребков при плавании).
// weight float64 — вес пользователя.
// duration float64 — длительность тренировки в часах.
func RunningSpentCalories(action int, weight, duration float64) float64 {
// ваш код здесь
...
}

// Константы для расчета калорий, расходуемых при ходьбе.
const (
walkingCaloriesWeightMultiplier = 0.035 // множитель массы тела.
walkingSpeedHeightMultiplier = 0.029 // множитель роста.
)

// WalkingSpentCalories возвращает количество потраченных калорий при ходьбе.
//
// Параметры:
//
// action int — количество совершенных действий(число шагов при ходьбе и беге, либо гребков при плавании).
// duration float64 — длительность тренировки в часах.
// weight float64 — вес пользователя.
// height float64 — рост пользователя.
func WalkingSpentCalories(action int, duration, weight, height float64) float64 {
// ваш код здесь
...
}

// Константы для расчета калорий, расходуемых при плавании.
const (
swimmingCaloriesMeanSpeedShift = 1.1 // среднее количество сжигаемых колорий при плавании относительно скорости.
swimmingCaloriesWeightMultiplier = 2 // множитель веса при плавании.
)

// swimmingMeanSpeed возвращает среднюю скорость при плавании.
//
// Параметры:
//
// lengthPool int — длина бассейна в метрах.
// countPool int — сколько раз пользователь переплыл бассейн.
// duration float64 — длительность тренировки в часах.
func swimmingMeanSpeed(lengthPool, countPool int, duration float64) float64 {
if duration == 0 {
return 0
}
return float64(lengthPool) * float64(countPool) / mInKm / duration
}

// SwimmingSpentCalories возвращает количество потраченных калорий при плавании.
//
// Параметры:
//
// lengthPool int — длина бассейна в метрах.
// countPool int — сколько раз пользователь переплыл бассейн.
// duration float64 — длительность тренировки в часах.
// weight float64 — вес пользователя.
func SwimmingSpentCalories(lengthPool, countPool int, duration, weight float64) float64 {
// ваш код здесь
...
}
173 changes: 173 additions & 0 deletions ftracker_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
package ftracker

import (
"testing"
)

func Test_distance(t *testing.T) {
type args struct {
action int
}
tests := []struct {
name string
args args
want float64
}{
// TODO: Add test cases.
{
name: "Success test",
args: args{
action: 2000,
},
want: 1.3,
},
{
name: "Null action",
args: args{
action: 0,
},
want: 0.0,
},
{
name: "One action",
args: args{
action: 1,
},
want: 0.00065,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := distance(tt.args.action); got != tt.want {
t.Errorf("distance() = %v, want %v", got, tt.want)
}
})
}
}

func Test_meanSpeed(t *testing.T) {
type args struct {
action int
duration float64
}
tests := []struct {
name string
args args
want float64
}{
// TODO: Add test cases.
{
name: "Successful test",
args: args{
action: 2000,
duration: 2.0,
},
want: 0.65,
},
{
name: "Null duration",
args: args{
action: 2000,
duration: 0,
},
want: 0,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := meanSpeed(tt.args.action, tt.args.duration); got != tt.want {
t.Errorf("meanSpeed() = %v, want %v", got, tt.want)
}
})
}
}

func TestShowTrainingInfo(t *testing.T) {
type args struct {
action int
trainingType string
duration float64
weight float64
height float64
lengthPool int
countPool int
}

runTest := "Тип тренировки: Бег\nДлительность: 0.15 ч.\nДистанция: 2.60 км.\nСкорость: 17.33 км/ч\nСожгли калорий: 427.24\n"

walkingTest := "Тип тренировки: Ходьба\nДлительность: 1.00 ч.\nДистанция: 2.60 км.\nСкорость: 2.60 км/ч\nСожгли калорий: 220.27\n"

swimmingTest := "Тип тренировки: Плавание\nДлительность: 0.25 ч.\nДистанция: 0.65 км.\nСкорость: 1.60 км/ч\nСожгли калорий: 114.75\n"

unknownTest := "неизвестный тип тренировки"

tests := []struct {
name string
args args
want string
}{
// TODO: Add test cases.
{
name: "run test",
args: args{
action: 4000,
trainingType: "Бег",
duration: 0.15,
weight: 85,
height: 185,
lengthPool: 50,
countPool: 2,
},
want: runTest,
},

{
name: "walking test",
args: args{
action: 4000,
trainingType: "Ходьба",
duration: 1,
weight: 85,
height: 185,
lengthPool: 50,
countPool: 2,
},
want: walkingTest,
},

{
name: "swimming test",
args: args{
action: 1000,
trainingType: "Плавание",
duration: 0.25,
weight: 85,
height: 185,
lengthPool: 100,
countPool: 4,
},
want: swimmingTest,
},

{
name: "unknown test",
args: args{
action: 1000,
trainingType: "Керлинг",
duration: 5,
weight: 85,
height: 185,
lengthPool: 50,
countPool: 2,
},
want: unknownTest,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := ShowTrainingInfo(tt.args.action, tt.args.trainingType, tt.args.duration, tt.args.weight, tt.args.height, tt.args.lengthPool, tt.args.countPool); got != tt.want {
t.Errorf("ShowTrainingInfo() = %v, want %v", got, tt.want)
}
})
}
}
3 changes: 3 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module github.com/Yandex-Practicum/go-first-floor-sprint-four

go 1.20

0 comments on commit a210825

Please sign in to comment.