Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions lesson_5/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.idea
3 changes: 3 additions & 0 deletions lesson_5/cmd/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module main.go

go 1.16
93 changes: 93 additions & 0 deletions lesson_5/cmd/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package main

import (
"errors"
"fmt"
"math"
)

type Shape interface {
Area() (float64, error)
Perimeter() (float64, error)
}

type Circle struct {
radius float64
}

type Rectangle struct {
height float64
width float64
}

func (c Circle) String() string {
return fmt.Sprintf("Circle: radius=%.2f", c.radius)
}

func (r Rectangle) String() string {
return fmt.Sprintf("Rectangle: width=%.2f height=%.2f", r.width, r.height)
}

func (c Circle) Area() (float64, error) {
if c.radius <= 0 {
return 0, errors.New("Negative radius\n")
} else {
return math.Pi * c.radius * c.radius, nil
}
}

func (c Circle) Perimeter() (float64, error) {
if c.radius <= 0 {
return 0, errors.New("Negative radius\n")
} else {
return 2 * math.Pi * c.radius, nil
}

}

func (r Rectangle) Area() (float64, error) {
if r.width <= 0 {
return 0, errors.New("Negative width\n")
} else if r.height <= 0 {
return 0, errors.New("Negative height\n")
} else {
return r.width * r.height, nil
}
}

func (r Rectangle) Perimeter() (float64, error) {
if r.width <= 0 {
return 0, errors.New("Negative width\n")
} else if r.height <= 0 {
return 0, errors.New("Negative height\n")
} else {
return (r.width + r.height) * 2, nil
}
}

func DescribeShape(s Shape) {
fmt.Println(s)
resArea, err := s.Area()
if err == nil {
fmt.Println(err)
} else {
fmt.Printf("Area: %.2f\n", resArea)
}

resPerimeter, err := s.Perimeter()
if err != nil {
fmt.Println(err)
} else {
fmt.Printf("Perimeter: %.2f\n", resPerimeter)
}

}
func main() {
c := Circle{radius: 8}
r := Rectangle{
height: 9,
width: 3,
}
DescribeShape(c)
DescribeShape(r)
}
177 changes: 177 additions & 0 deletions lesson_5/cmd/main_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
package main

import "testing"

func TestCircle_Area(t *testing.T) {
type fields struct {
radius float64
}
tests := []struct {
name string
fields fields
want float64
wantErr bool
}{
{name: "return err if negative value",
fields: fields{radius: -10},
want: 0,
wantErr: true,
},
{name: "return 201.06192982974676",
fields: fields{radius: 8},
want: 201.06192982974676,
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
c := Circle{
radius: tt.fields.radius,
}
got, err := c.Area()
if (err != nil) != tt.wantErr {
t.Errorf("Area() error = %v, wantErr %v", err, tt.wantErr)
return
}
if got != tt.want {
t.Errorf("Area() got = %v, want %v", got, tt.want)
}
})
}
}

func TestCircle_Perimeter(t *testing.T) {
type fields struct {
radius float64
}
tests := []struct {
name string
fields fields
want float64
wantErr bool
}{
{
name: "negative value",
fields: fields{radius: -10},
want: 0,
wantErr: true,
},
{
name: "want to 50.26548245743669 value",
fields: fields{radius: 8},
want: 50.26548245743669,
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
c := Circle{
radius: tt.fields.radius,
}
got, err := c.Perimeter()
if (err != nil) != tt.wantErr {
t.Errorf("Perimeter() error = %v, wantErr %v", err, tt.wantErr)
return
}
if got != tt.want {
t.Errorf("Perimeter() got = %v, want %v", got, tt.want)
}
})
}
}

func TestRectangle_Area(t *testing.T) {
type fields struct {
height float64
width float64
}
tests := []struct {
name string
fields fields
want float64
wantErr bool
}{
{
name: "want to 27.0 value",
fields: fields{width: 3, height: 9},
want: 27.0,
wantErr: false,
},
{
name: "err negative width",
fields: fields{width: -3, height: 9},
want: 0,
wantErr: true,
},
{
name: "err negative height",
fields: fields{width: 3, height: -9},
want: 0,
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
r := Rectangle{
height: tt.fields.height,
width: tt.fields.width,
}
got, err := r.Area()
if (err != nil) != tt.wantErr {
t.Errorf("Area() error = %v, wantErr %v", err, tt.wantErr)
return
}
if got != tt.want {
t.Errorf("Area() got = %v, want %v", got, tt.want)
}
})
}
}

func TestRectangle_Perimeter(t *testing.T) {
type fields struct {
height float64
width float64
}
tests := []struct {
name string
fields fields
want float64
wantErr bool
}{
{
name: "want to 27 value",
fields: fields{width: 3, height: 9},
want: 24,
wantErr: false,
},
{
name: "err negative width",
fields: fields{width: -3, height: 9},
want: 0,
wantErr: true,
},
{
name: "err negative height",
fields: fields{width: 3, height: -9},
want: 0,
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
r := Rectangle{
height: tt.fields.height,
width: tt.fields.width,
}
got, err := r.Perimeter()
if (err != nil) != tt.wantErr {
t.Errorf("Perimeter() error = %v, wantErr %v", err, tt.wantErr)
return
}
if got != tt.want {
t.Errorf("Perimeter() got = %v, want %v", got, tt.want)
}
})
}
}
1 change: 1 addition & 0 deletions lesson_6/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.idea
3 changes: 3 additions & 0 deletions lesson_6/task_1/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module main.go

go 1.16
45 changes: 45 additions & 0 deletions lesson_6/task_1/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package main

import (
"encoding/json"
"fmt"
"log"
"net/http"
)

type User struct {
Host string `json:"host: "`
UserAgent string `json:"user_agent: "`
RequestUri string `json:"request_uri: "`
Headers map[string][]string `json:"headers: "`
}

func (u User) String() string {
j, _ := json.MarshalIndent(u, "", " ")
return string(j)
}

func currentUser(r *http.Request) User {
var u User
u.Headers = make(map[string][]string)
u.Host = r.Host
u.UserAgent = r.UserAgent()
u.RequestUri = r.RequestURI
u.Headers["Accept"] = r.Header["Accept"]
u.Headers["User-Agent"] = r.Header["User-Agent"]

return u
}

func root(w http.ResponseWriter, r *http.Request) {
u := currentUser(r)
fmt.Fprintf(w, u.String())
}

func main() {
fmt.Println("Start to port 8080...")
http.HandleFunc("/", root)
if err := http.ListenAndServe(":8080", nil); err != nil {
log.Fatal(err)
}
}
28 changes: 28 additions & 0 deletions lesson_6/task_2/client.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package main

import (
"bufio"
"fmt"
"net"
"os"
)

func main() {
conn, _ := net.Dial("tcp", "127.0.0.1:8080")
defer conn.Close()
for {
reader := bufio.NewReader(os.Stdin)
fmt.Print("Text to send: ")
text, _ := reader.ReadString('\n')
fmt.Fprintf(conn, text)
message, _ := bufio.NewReader(conn).ReadString('\n')
fmt.Print("Message from server: " + message)

r := []rune(message)
r = r[:len(r)-2]
text = string(r)
if text == "EXIT" {
break
}
}
}
32 changes: 32 additions & 0 deletions lesson_6/task_2/server.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package main

import (
"bufio"
"fmt"
"net"
"strconv"
"strings"
)

func main() {

fmt.Println("Launching server...")
ln, _ := net.Listen("tcp", ":8080")
conn, _ := ln.Accept()

for {
message, _ := bufio.NewReader(conn).ReadString('\n')
fmt.Print("Message Received:", message)
r := []rune(message)
r = r[:len(r)-2]

var newMessage string
i, err := strconv.Atoi(string(r))
if err == nil {
newMessage = strconv.Itoa(i * 2)
} else {
newMessage = strings.ToUpper(message)
}
conn.Write([]byte(newMessage + "\n"))
}
}
Loading