Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

290 wiersze
6.3KB

  1. package template_test
  2. import (
  3. _ "embed"
  4. "math"
  5. "testing"
  6. "git.wtrh.nl/patterns/gopatterns/pkg/dimensions"
  7. "git.wtrh.nl/patterns/gopatterns/pkg/position"
  8. "git.wtrh.nl/patterns/gopatterns/pkg/position/testutil"
  9. "git.wtrh.nl/patterns/gopatterns/pkg/template"
  10. "git.wtrh.nl/patterns/gopatterns/pkg/util"
  11. "git.wtrh.nl/patterns/gopatterns/pkg/vector"
  12. "github.com/stretchr/testify/require"
  13. "gopkg.in/yaml.v3"
  14. )
  15. //go:embed fixtures/absolute_points.yaml
  16. var absolutePoints []byte
  17. //go:embed fixtures/relative_points.yaml
  18. var relativePoints []byte
  19. //go:embed fixtures/between_points.yaml
  20. var betweenPoints []byte
  21. //go:embed fixtures/extend_points.yaml
  22. var extendPoints []byte
  23. //go:embed fixtures/polar_points.yaml
  24. var polarPoints []byte
  25. //go:embed fixtures/functions.yaml
  26. var functions []byte
  27. //go:embed fixtures/evaluation_functions.yaml
  28. var evaluationFunctions []byte
  29. //go:embed fixtures/references.yaml
  30. var references []byte
  31. func TestAbsolutePoint(t *testing.T) {
  32. temp := &template.Template{}
  33. require.NoError(t, yaml.Unmarshal(absolutePoints, temp))
  34. panel, err := temp.GetPanel(template.Request{
  35. Dims: dimensions.Dimensions{"test": dimensions.Dimension{
  36. Name: "Test",
  37. Value: 1.3,
  38. }},
  39. Panel: "body",
  40. })
  41. require.NoError(t, err)
  42. p1, ok := panel.Points["1"]
  43. require.True(t, ok)
  44. require.Equal(t, position.Position{
  45. Vector: vector.Vector{
  46. X: 1.3,
  47. Y: 14.3,
  48. },
  49. Rotation: 0,
  50. }, p1.Position())
  51. p2, ok := panel.Points["2"]
  52. require.True(t, ok)
  53. require.Equal(t, position.Position{
  54. Vector: vector.Vector{
  55. X: 2.6,
  56. Y: -3,
  57. },
  58. Rotation: 0,
  59. }, p2.Position())
  60. }
  61. func TestBetweenPoints(t *testing.T) {
  62. temp := &template.Template{}
  63. require.NoError(t, yaml.Unmarshal(betweenPoints, temp))
  64. panel, err := temp.GetPanel(template.Request{
  65. Dims: dimensions.Dimensions{"test": dimensions.Dimension{
  66. Name: "Test",
  67. Value: 0.5,
  68. }},
  69. Panel: "body",
  70. })
  71. require.NoError(t, err)
  72. p1, ok := panel.Points["1"]
  73. require.True(t, ok)
  74. testutil.EqualPosition(t, position.Position{
  75. Vector: vector.Vector{
  76. X: 4,
  77. Y: 14.3,
  78. },
  79. Rotation: 0,
  80. }, p1.Position(), 1e-10)
  81. p2, ok := panel.Points["2"]
  82. require.True(t, ok)
  83. testutil.EqualPosition(t, position.Position{
  84. Vector: vector.Vector{
  85. X: 6,
  86. Y: 11.3,
  87. },
  88. Rotation: 0,
  89. }, p2.Position(), 1e-10)
  90. p3, ok := panel.Points["3"]
  91. require.True(t, ok)
  92. testutil.EqualPosition(t, position.Position{
  93. Vector: vector.Vector{
  94. X: 5,
  95. Y: 12.8,
  96. },
  97. Rotation: math.Atan2(-3, 2) - math.Pi/2,
  98. }, p3.Position(), 1e-10)
  99. }
  100. func TestRelativePoints(t *testing.T) {
  101. temp := &template.Template{}
  102. require.NoError(t, yaml.Unmarshal(relativePoints, temp))
  103. panel, err := temp.GetPanel(template.Request{
  104. Dims: dimensions.Dimensions{"test": dimensions.Dimension{
  105. Name: "Test",
  106. Value: 1.3,
  107. }},
  108. Panel: "body",
  109. })
  110. require.NoError(t, err)
  111. p1, ok := panel.Points["1"]
  112. require.True(t, ok)
  113. testutil.EqualPosition(t, position.Position{
  114. Vector: vector.Vector{
  115. X: 1.3,
  116. Y: 14.3,
  117. },
  118. Rotation: 0,
  119. }, p1.Position(), 1e-10)
  120. p2, ok := panel.Points["2"]
  121. require.True(t, ok)
  122. testutil.EqualPosition(t, position.Position{
  123. Vector: vector.Vector{
  124. X: 3.9,
  125. Y: 11.3,
  126. },
  127. Rotation: 0,
  128. }, p2.Position(), 1e-10)
  129. }
  130. func TestExtendPoints(t *testing.T) {
  131. temp := &template.Template{}
  132. require.NoError(t, yaml.Unmarshal(extendPoints, temp))
  133. panel, err := temp.GetPanel(template.Request{
  134. Dims: dimensions.Dimensions{"test": dimensions.Dimension{
  135. Name: "Test",
  136. Value: 1.3,
  137. }},
  138. Panel: "body",
  139. })
  140. require.NoError(t, err)
  141. p1, ok := panel.Points["1"]
  142. require.True(t, ok)
  143. testutil.EqualPosition(t, position.Position{}, p1.Position(), 1e-10)
  144. p2, ok := panel.Points["2"]
  145. require.True(t, ok)
  146. testutil.EqualPosition(t, position.Position{
  147. Vector: vector.Vector{
  148. X: 4,
  149. Y: 3,
  150. },
  151. Rotation: 0,
  152. }, p2.Position(), 1e-10)
  153. p3, ok := panel.Points["3"]
  154. require.True(t, ok)
  155. testutil.EqualPosition(t, position.Position{
  156. Vector: vector.Vector{
  157. X: 8,
  158. Y: 6,
  159. },
  160. Rotation: math.Atan2(3, 4) - math.Pi/2,
  161. }, p3.Position(), 1e-10)
  162. }
  163. func TestPolarPoints(t *testing.T) {
  164. temp := &template.Template{}
  165. require.NoError(t, yaml.Unmarshal(polarPoints, temp))
  166. panel, err := temp.GetPanel(template.Request{
  167. Dims: dimensions.Dimensions{"test": dimensions.Dimension{
  168. Name: "Test",
  169. Value: 1.3,
  170. }},
  171. Panel: "body",
  172. })
  173. require.NoError(t, err)
  174. p1, ok := panel.Points["1"]
  175. require.True(t, ok)
  176. testutil.EqualPosition(t, position.Position{}, p1.Position(), 1e-10)
  177. p2, ok := panel.Points["2"]
  178. require.True(t, ok)
  179. testutil.EqualPosition(t, position.Position{
  180. Vector: vector.Vector{
  181. X: 1,
  182. Y: 0,
  183. },
  184. Rotation: 0,
  185. }, p2.Position(), 1e-10)
  186. p3, ok := panel.Points["3"]
  187. require.True(t, ok)
  188. testutil.EqualPosition(t, position.Position{
  189. Vector: vector.Vector{
  190. X: 1,
  191. Y: 1,
  192. },
  193. Rotation: math.Pi / 2,
  194. }, p3.Position(), 1e-10)
  195. }
  196. func TestFunctions(t *testing.T) {
  197. tests := map[string]struct {
  198. result float64
  199. }{
  200. "distance": {result: 5},
  201. "angle": {result: math.Atan2(3, 4)},
  202. "yDistance": {result: 3},
  203. "xDistance": {result: 4},
  204. "lineLength": {result: 12},
  205. "lineLength2": {result: 4},
  206. }
  207. temp := &template.Template{}
  208. require.NoError(t, yaml.Unmarshal(functions, temp))
  209. panel, err := temp.GetPanel(template.Request{Panel: "test"})
  210. require.NoError(t, err)
  211. for name, test := range tests {
  212. t.Run(name, func(t *testing.T) {
  213. p, ok := panel.Points[util.ID(name)]
  214. require.True(t, ok)
  215. require.InDelta(t, test.result, p.Vector().X, 1e-10)
  216. })
  217. }
  218. }
  219. func TestEvaluationFunctions(t *testing.T) {
  220. tests := map[string]struct {
  221. result float64
  222. }{
  223. "acos": {result: math.Acos(0.5)},
  224. "asin": {result: math.Asin(math.Pi / 2)},
  225. "atan2": {result: math.Atan2(1, 1)},
  226. "abs1": {result: math.Abs(-1.4)},
  227. "abs2": {result: math.Abs(3.5)},
  228. }
  229. temp := &template.Template{}
  230. require.NoError(t, yaml.Unmarshal(evaluationFunctions, temp))
  231. panel, err := temp.GetPanel(template.Request{Panel: "test"})
  232. require.NoError(t, err)
  233. for name, test := range tests {
  234. t.Run(name, func(t *testing.T) {
  235. p, ok := panel.Points[util.ID(name)]
  236. require.True(t, ok)
  237. require.InDelta(t, test.result, p.Vector().X, 1e-10)
  238. })
  239. }
  240. }
  241. func TestReferences(t *testing.T) {
  242. temp := &template.Template{}
  243. require.NoError(t, yaml.Unmarshal(references, temp))
  244. panel, err := temp.GetPanel(template.Request{Panel: "body"})
  245. require.NoError(t, err)
  246. _ = panel
  247. }