From 5d4865b549611daf21c35f0fe470d1cd1497ebb0 Mon Sep 17 00:00:00 2001
From: Andrey Ivanov <tiburon-777@users.noreply.github.com>
Date: Tue, 21 Jul 2020 15:19:50 +0300
Subject: [PATCH] =?UTF-8?q?HW05=20=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=BE=20(?=
 =?UTF-8?q?=D1=81=D0=BF=D0=BE=D1=81=D0=BE=D0=B1=201=20-=20=D0=BF=D0=B8?=
 =?UTF-8?q?=D0=BB=D0=BE=D0=BE=D0=B1=D1=80=D0=B0=D0=B7=D0=BD=D1=8B=D0=B9=20?=
 =?UTF-8?q?=D1=81=D0=B4=D0=B2=D0=B8=D0=B3)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 hw05_parallel_execution/run.go      |  4 ++--
 hw05_parallel_execution/run_test.go | 36 ++++++++++++++++++++++++++++-
 2 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/hw05_parallel_execution/run.go b/hw05_parallel_execution/run.go
index 241a058..a01b12e 100644
--- a/hw05_parallel_execution/run.go
+++ b/hw05_parallel_execution/run.go
@@ -23,7 +23,7 @@ func Run(tasks []Task, n int, m int) error {
 			wg.Add(1)
 			go func(rt Task, errs *Errors) {
 				defer wg.Done()
-				err := rt
+				err := rt()
 				if err != nil {
 					errs.mx.Lock()
 					errs.count++
@@ -32,7 +32,7 @@ func Run(tasks []Task, n int, m int) error {
 			}(tasks[i+g], &errs)
 		}
 		wg.Wait()
-		if errs.count > m {
+		if m > 0 && errs.count > m {
 			log.Println("Produced", errs.count, "errors of", m)
 			return ErrErrorsLimitExceeded
 		}
diff --git a/hw05_parallel_execution/run_test.go b/hw05_parallel_execution/run_test.go
index d1157c8..78b742d 100644
--- a/hw05_parallel_execution/run_test.go
+++ b/hw05_parallel_execution/run_test.go
@@ -37,11 +37,45 @@ func TestRun(t *testing.T) {
 		require.LessOrEqual(t, runTasksCount, int32(workersCount+maxErrorsCount), "extra tasks were started")
 	})
 
+	t.Run("if m<0 then ignore errores", func(t *testing.T) {
+		tasksCount := 50
+		tasks := make([]Task, 0, tasksCount)
+
+		var runTasksCount int32 = 1
+		var sumTime time.Duration
+
+		for i := 0; i < tasksCount; i++ {
+			err := fmt.Errorf("error from task %d", i)
+			taskSleep := time.Millisecond * time.Duration(rand.Intn(100))
+			sumTime += taskSleep
+
+			tasks = append(tasks, func() error {
+				time.Sleep(taskSleep)
+				atomic.AddInt32(&runTasksCount, 1)
+				if i%2 == 0 {
+					return err
+				}
+				return nil
+			})
+		}
+
+		workersCount := 5
+		maxErrorsCount := -1
+
+		start := time.Now()
+		result := Run(tasks, workersCount, maxErrorsCount)
+		elapsedTime := time.Since(start)
+		require.Nil(t, result)
+
+		require.Equal(t, runTasksCount, int32(tasksCount), "not all tasks were completed")
+		require.LessOrEqual(t, int64(elapsedTime), int64(sumTime/2), "tasks were run sequentially?")
+	})
+
 	t.Run("tasks without errors", func(t *testing.T) {
 		tasksCount := 50
 		tasks := make([]Task, 0, tasksCount)
 
-		var runTasksCount int32
+		var runTasksCount int32 = 1
 		var sumTime time.Duration
 
 		for i := 0; i < tasksCount; i++ {