session_sum_test.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. // Copyright 2017 The Xorm Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package xorm
  5. import (
  6. "fmt"
  7. "strconv"
  8. "testing"
  9. "github.com/stretchr/testify/assert"
  10. )
  11. func isFloatEq(i, j float64, precision int) bool {
  12. return fmt.Sprintf("%."+strconv.Itoa(precision)+"f", i) == fmt.Sprintf("%."+strconv.Itoa(precision)+"f", j)
  13. }
  14. func TestSum(t *testing.T) {
  15. assert.NoError(t, prepareEngine())
  16. type SumStruct struct {
  17. Int int
  18. Float float32
  19. }
  20. var (
  21. cases = []SumStruct{
  22. {1, 6.2},
  23. {2, 5.3},
  24. {92, -0.2},
  25. }
  26. )
  27. var i int
  28. var f float32
  29. for _, v := range cases {
  30. i += v.Int
  31. f += v.Float
  32. }
  33. assert.NoError(t, testEngine.Sync2(new(SumStruct)))
  34. cnt, err := testEngine.Insert(cases)
  35. assert.NoError(t, err)
  36. assert.EqualValues(t, 3, cnt)
  37. colInt := testEngine.ColumnMapper.Obj2Table("Int")
  38. colFloat := testEngine.ColumnMapper.Obj2Table("Float")
  39. sumInt, err := testEngine.Sum(new(SumStruct), colInt)
  40. assert.NoError(t, err)
  41. assert.EqualValues(t, int(sumInt), i)
  42. sumFloat, err := testEngine.Sum(new(SumStruct), colFloat)
  43. assert.NoError(t, err)
  44. assert.Condition(t, func() bool {
  45. return isFloatEq(sumFloat, float64(f), 2)
  46. })
  47. sums, err := testEngine.Sums(new(SumStruct), colInt, colFloat)
  48. assert.NoError(t, err)
  49. assert.EqualValues(t, 2, len(sums))
  50. assert.EqualValues(t, i, int(sums[0]))
  51. assert.Condition(t, func() bool {
  52. return isFloatEq(sums[1], float64(f), 2)
  53. })
  54. sumsInt, err := testEngine.SumsInt(new(SumStruct), colInt)
  55. assert.NoError(t, err)
  56. assert.EqualValues(t, 1, len(sumsInt))
  57. assert.EqualValues(t, i, int(sumsInt[0]))
  58. }
  59. func TestSumCustomColumn(t *testing.T) {
  60. assert.NoError(t, prepareEngine())
  61. type SumStruct struct {
  62. Int int
  63. Float float32
  64. }
  65. var (
  66. cases = []SumStruct{
  67. {1, 6.2},
  68. {2, 5.3},
  69. {92, -0.2},
  70. }
  71. )
  72. assert.NoError(t, testEngine.Sync2(new(SumStruct)))
  73. cnt, err := testEngine.Insert(cases)
  74. assert.NoError(t, err)
  75. assert.EqualValues(t, 3, cnt)
  76. sumInt, err := testEngine.Sum(new(SumStruct),
  77. "CASE WHEN `int` <= 2 THEN `int` ELSE 0 END")
  78. assert.NoError(t, err)
  79. assert.EqualValues(t, 3, int(sumInt))
  80. }