Advertisement
Guest User

Untitled

a guest
May 26th, 2016
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.29 KB | None | 0 0
  1. package main
  2. import (
  3. "fmt"
  4. "github.com/facebookgo/inject"
  5. "strings"
  6. )
  7. type ILog interface {
  8. Log(string)
  9. }
  10. //------------------------------------------------------------------------------
  11. // IVehicle describes ...
  12. type IVehicle interface {
  13. MinimumAge() int
  14. Wheels() int
  15. }
  16. type ILicenseCheck interface {
  17. CanDrive(Person, IVehicle) bool
  18. }
  19. type DefaultLicenseCheck struct {}
  20. func (d *DefaultLicenseCheck) CanDrive(p Person, v IVehicle) bool {
  21. return p.Age >= v.MinimumAge()
  22. }
  23. //------------------------------------------------------------------------------
  24. // Car is ...
  25. type Car struct {
  26. Log ILog `inject:""`
  27. engine string
  28. wheels int
  29. }
  30. // NewCar creates ...
  31. func NewCar() *Car {
  32. return &Car{wheels: 4}
  33. }
  34. // Wheels return ...
  35. func (c *Car) Wheels() int {
  36. c.Log.Log("Car wheels")
  37. return c.wheels
  38. }
  39. func (c *Car) MinimumAge() int {
  40. return 16
  41. }
  42. //------------------------------------------------------------------------------
  43. // Bike is ...
  44. type Bike struct {
  45. Log ILog `inject:""`
  46. wheels int
  47. }
  48. // NewBike creates ...
  49. func NewBike() *Bike {
  50. return &Bike{wheels: 2}
  51. }
  52. // Wheels return ...
  53. func (b *Bike) Wheels() int {
  54. b.Log.Log("Bike wheels")
  55. return b.wheels
  56. }
  57. func (b *Bike) MinimumAge() int {
  58. return 4
  59. }
  60. //------------------------------------------------------------------------------
  61. // Person is ...
  62. type Person struct {
  63. Vehicle IVehicle `inject:""`
  64. Log ILog `inject:""`
  65. LicenseCheck ILicenseCheck `inject:""`
  66. Age int
  67. }
  68. // NewPerson creates ...
  69. func NewPerson(age int) *Person {
  70. return &Person{
  71. Age: age,
  72. }
  73. }
  74. func (person *Person) Drive() {
  75. if !person.LicenseCheck.CanDrive(*person, person.Vehicle) {
  76. person.Log.Log("Waah! I can't drive this yet!")
  77. } else {
  78. person.Log.Log(fmt.Sprintf("Driving around on %d wheels", person.Vehicle.Wheels()))
  79. }
  80. }
  81. //------------------------------------------------------------------------------
  82. type ConsoleLog struct {
  83. }
  84. func (consoleLog *ConsoleLog) Log(info string) {
  85. fmt.Println(info)
  86. }
  87. //==============================================================================
  88. var (
  89. person = NewPerson(12)
  90. car = NewCar()
  91. bike = NewBike()
  92. )
  93. func init() {
  94. log := &ConsoleLog{}
  95. licenseCheck := &DefaultLicenseCheck{}
  96. inject.Populate(person, log, car, licenseCheck)
  97. }
  98. func main() {
  99. person.Drive()
  100. mockTest()
  101. }
  102. type MockILicenseCheck struct {
  103. timesCalled int
  104. WhatToReturn bool
  105. }
  106. func (m *MockILicenseCheck) CanDrive(p Person, v IVehicle) bool {
  107. m.timesCalled++
  108. return m.WhatToReturn
  109. }
  110. func (m *MockILicenseCheck) Reset() {
  111. m.timesCalled = 0
  112. }
  113. type MockILog struct {
  114. timesCalled int
  115. LastMessage string
  116. }
  117. func (m *MockILog) Log(value string) {
  118. m.timesCalled++
  119. m.LastMessage = value
  120. }
  121. func (m *MockILog) Reset() {
  122. m.timesCalled = 0
  123. m.LastMessage = ""
  124. }
  125. func mockTest() {
  126. log := &MockILog{}
  127. licenseCheck := &MockILicenseCheck{WhatToReturn: true}
  128. p := NewPerson(12)
  129. b := NewBike()
  130. inject.Populate(log, licenseCheck, b, p)
  131. p.Drive()
  132. fmt.Printf("Expect 1, actual %d\n", licenseCheck.timesCalled)
  133. fmt.Printf("Expect false, actual %t\n", strings.HasPrefix(log.LastMessage, "Waah"))
  134. log.Reset()
  135. licenseCheck.Reset()
  136. licenseCheck.WhatToReturn = false
  137. p.Drive()
  138. fmt.Printf("Expect true, actual %t\n", strings.HasPrefix(log.LastMessage, "Waah"))
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement