pivotTable_test.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package excelize
  2. import (
  3. "fmt"
  4. "math/rand"
  5. "path/filepath"
  6. "testing"
  7. "github.com/stretchr/testify/assert"
  8. )
  9. func TestAddPivotTable(t *testing.T) {
  10. f := NewFile()
  11. // Create some data in a sheet
  12. month := []string{"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}
  13. year := []int{2017, 2018, 2019}
  14. types := []string{"Meat", "Dairy", "Beverages", "Produce"}
  15. region := []string{"East", "West", "North", "South"}
  16. f.SetSheetRow("Sheet1", "A1", &[]string{"Month", "Year", "Type", "Sales", "Region"})
  17. for i := 0; i < 30; i++ {
  18. f.SetCellValue("Sheet1", fmt.Sprintf("A%d", i+2), month[rand.Intn(12)])
  19. f.SetCellValue("Sheet1", fmt.Sprintf("B%d", i+2), year[rand.Intn(3)])
  20. f.SetCellValue("Sheet1", fmt.Sprintf("C%d", i+2), types[rand.Intn(4)])
  21. f.SetCellValue("Sheet1", fmt.Sprintf("D%d", i+2), rand.Intn(5000))
  22. f.SetCellValue("Sheet1", fmt.Sprintf("E%d", i+2), region[rand.Intn(4)])
  23. }
  24. assert.NoError(t, f.AddPivotTable(&PivotTableOption{
  25. DataRange: "Sheet1!$A$1:$E$31",
  26. PivotTableRange: "Sheet1!$G$2:$M$34",
  27. Rows: []string{"Month", "Year"},
  28. Columns: []string{"Type"},
  29. Data: []string{"Sales"},
  30. }))
  31. // Use different order of coordinate tests
  32. assert.NoError(t, f.AddPivotTable(&PivotTableOption{
  33. DataRange: "Sheet1!$A$1:$E$31",
  34. PivotTableRange: "Sheet1!$U$34:$O$2",
  35. Rows: []string{"Month", "Year"},
  36. Columns: []string{"Type"},
  37. Data: []string{"Sales"},
  38. }))
  39. assert.NoError(t, f.AddPivotTable(&PivotTableOption{
  40. DataRange: "Sheet1!$A$1:$E$31",
  41. PivotTableRange: "Sheet1!$W$2:$AC$34",
  42. Rows: []string{"Month", "Year"},
  43. Columns: []string{"Region"},
  44. Data: []string{"Sales"},
  45. }))
  46. assert.NoError(t, f.AddPivotTable(&PivotTableOption{
  47. DataRange: "Sheet1!$A$1:$E$31",
  48. PivotTableRange: "Sheet1!$G$37:$W$50",
  49. Rows: []string{"Month"},
  50. Columns: []string{"Region", "Year"},
  51. Data: []string{"Sales"},
  52. }))
  53. f.NewSheet("Sheet2")
  54. assert.NoError(t, f.AddPivotTable(&PivotTableOption{
  55. DataRange: "Sheet1!$A$1:$E$31",
  56. PivotTableRange: "Sheet2!$A$1:$AR$15",
  57. Rows: []string{"Month"},
  58. Columns: []string{"Region", "Type", "Year"},
  59. Data: []string{"Sales"},
  60. }))
  61. assert.NoError(t, f.AddPivotTable(&PivotTableOption{
  62. DataRange: "Sheet1!$A$1:$E$31",
  63. PivotTableRange: "Sheet2!$A$18:$AR$54",
  64. Rows: []string{"Month", "Type"},
  65. Columns: []string{"Region", "Year"},
  66. Data: []string{"Sales"},
  67. }))
  68. // Test empty pivot table options
  69. assert.EqualError(t, f.AddPivotTable(nil), "parameter is required")
  70. // Test invalid data range
  71. assert.EqualError(t, f.AddPivotTable(&PivotTableOption{
  72. DataRange: "Sheet1!$A$1:$A$1",
  73. PivotTableRange: "Sheet1!$U$34:$O$2",
  74. Rows: []string{"Month", "Year"},
  75. Columns: []string{"Type"},
  76. Data: []string{"Sales"},
  77. }), `parameter 'DataRange' parsing error: parameter is invalid`)
  78. // Test the data range of the worksheet that is not declared
  79. assert.EqualError(t, f.AddPivotTable(&PivotTableOption{
  80. DataRange: "$A$1:$E$31",
  81. PivotTableRange: "Sheet1!$U$34:$O$2",
  82. Rows: []string{"Month", "Year"},
  83. Columns: []string{"Type"},
  84. Data: []string{"Sales"},
  85. }), `parameter 'DataRange' parsing error: parameter is invalid`)
  86. // Test the worksheet declared in the data range does not exist
  87. assert.EqualError(t, f.AddPivotTable(&PivotTableOption{
  88. DataRange: "SheetN!$A$1:$E$31",
  89. PivotTableRange: "Sheet1!$U$34:$O$2",
  90. Rows: []string{"Month", "Year"},
  91. Columns: []string{"Type"},
  92. Data: []string{"Sales"},
  93. }), "sheet SheetN is not exist")
  94. // Test the pivot table range of the worksheet that is not declared
  95. assert.EqualError(t, f.AddPivotTable(&PivotTableOption{
  96. DataRange: "Sheet1!$A$1:$E$31",
  97. PivotTableRange: "$U$34:$O$2",
  98. Rows: []string{"Month", "Year"},
  99. Columns: []string{"Type"},
  100. Data: []string{"Sales"},
  101. }), `parameter 'PivotTableRange' parsing error: parameter is invalid`)
  102. // Test the worksheet declared in the pivot table range does not exist
  103. assert.EqualError(t, f.AddPivotTable(&PivotTableOption{
  104. DataRange: "Sheet1!$A$1:$E$31",
  105. PivotTableRange: "SheetN!$U$34:$O$2",
  106. Rows: []string{"Month", "Year"},
  107. Columns: []string{"Type"},
  108. Data: []string{"Sales"},
  109. }), "sheet SheetN is not exist")
  110. // Test not exists worksheet in data range
  111. assert.EqualError(t, f.AddPivotTable(&PivotTableOption{
  112. DataRange: "SheetN!$A$1:$E$31",
  113. PivotTableRange: "Sheet1!$U$34:$O$2",
  114. Rows: []string{"Month", "Year"},
  115. Columns: []string{"Type"},
  116. Data: []string{"Sales"},
  117. }), "sheet SheetN is not exist")
  118. // Test invalid row number in data range
  119. assert.EqualError(t, f.AddPivotTable(&PivotTableOption{
  120. DataRange: "Sheet1!$A$0:$E$31",
  121. PivotTableRange: "Sheet1!$U$34:$O$2",
  122. Rows: []string{"Month", "Year"},
  123. Columns: []string{"Type"},
  124. Data: []string{"Sales"},
  125. }), `parameter 'DataRange' parsing error: cannot convert cell "A0" to coordinates: invalid cell name "A0"`)
  126. assert.NoError(t, f.SaveAs(filepath.Join("test", "TestAddPivotTable1.xlsx")))
  127. // Test adjust range with invalid range
  128. _, _, err := f.adjustRange("")
  129. assert.EqualError(t, err, "parameter is required")
  130. // Test get pivot fields order with empty data range
  131. _, err = f.getPivotFieldsOrder("")
  132. assert.EqualError(t, err, `parameter 'DataRange' parsing error: parameter is required`)
  133. // Test add pivot cache with empty data range
  134. assert.EqualError(t, f.addPivotCache(0, "", &PivotTableOption{}, nil), "parameter 'DataRange' parsing error: parameter is required")
  135. // Test add pivot cache with invalid data range
  136. assert.EqualError(t, f.addPivotCache(0, "", &PivotTableOption{
  137. DataRange: "$A$1:$E$31",
  138. PivotTableRange: "Sheet1!$U$34:$O$2",
  139. Rows: []string{"Month", "Year"},
  140. Columns: []string{"Type"},
  141. Data: []string{"Sales"},
  142. }, nil), "parameter 'DataRange' parsing error: parameter is invalid")
  143. // Test add pivot table with empty options
  144. assert.EqualError(t, f.addPivotTable(0, 0, "", &PivotTableOption{}), "parameter 'PivotTableRange' parsing error: parameter is required")
  145. // Test add pivot table with invalid data range
  146. assert.EqualError(t, f.addPivotTable(0, 0, "", &PivotTableOption{}), "parameter 'PivotTableRange' parsing error: parameter is required")
  147. // Test add pivot fields with empty data range
  148. assert.EqualError(t, f.addPivotFields(nil, &PivotTableOption{
  149. DataRange: "$A$1:$E$31",
  150. PivotTableRange: "Sheet1!$U$34:$O$2",
  151. Rows: []string{"Month", "Year"},
  152. Columns: []string{"Type"},
  153. Data: []string{"Sales"},
  154. }), `parameter 'DataRange' parsing error: parameter is invalid`)
  155. // Test get pivot fields index with empty data range
  156. _, err = f.getPivotFieldsIndex([]string{}, &PivotTableOption{})
  157. assert.EqualError(t, err, `parameter 'DataRange' parsing error: parameter is required`)
  158. }