github.com/pdfcpu/pdfcpu@v0.11.1/pkg/api/test/selectPages_test.go (about) 1 /* 2 Copyright 2018 The pdfcpu Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package test 18 19 import ( 20 "fmt" 21 "testing" 22 23 "strings" 24 25 "github.com/pdfcpu/pdfcpu/pkg/api" 26 "github.com/pdfcpu/pdfcpu/pkg/pdfcpu/types" 27 ) 28 29 func testPageSelectionSyntaxOk(t *testing.T, s string) { 30 t.Helper() 31 _, err := api.ParsePageSelection(s) 32 if err != nil { 33 t.Errorf("doTestPageSelectionSyntaxOk(%s)\n", s) 34 } 35 } 36 37 func testPageSelectionSyntaxFail(t *testing.T, s string) { 38 t.Helper() 39 _, err := api.ParsePageSelection(s) 40 if err == nil { 41 t.Errorf("doTestPageSelectionSyntaxFail(%s)\n", s) 42 } 43 } 44 45 // Test the pageSelection string. 46 // This is used to select specific pages for extraction and trimming. 47 func TestPageSelectionSyntax(t *testing.T) { 48 psOk := []string{"1", "!1", "n1", "1-", "!1-", "n1-", "-5", "!-5", "n-5", "3-5", "!3-5", "n3-5", 49 "1,2,3", "!-5,10-15,30-", "1-,n4", "odd", "even", " 1"} 50 51 for _, s := range psOk { 52 testPageSelectionSyntaxOk(t, s) 53 } 54 55 psFail := []string{"1,", "1 ", "-", " -", " !"} 56 57 for _, s := range psFail { 58 testPageSelectionSyntaxFail(t, s) 59 } 60 } 61 62 func selectedPagesString(sp types.IntSet, pageCount int) string { 63 s := []string{} 64 var t string 65 66 for i := 1; i <= pageCount; i++ { 67 if sp[i] { 68 t = "1" 69 } else { 70 t = "0" 71 } 72 s = append(s, t) 73 } 74 75 return strings.Join(s, "") 76 } 77 78 func testSelectedPages(s string, pageCount int, compareString string, t *testing.T) { 79 pageSelection, err := api.ParsePageSelection(s) 80 if err != nil { 81 t.Fatalf("testSelectedPages(%s) %v\n", s, err) 82 } 83 84 selectedPages, err := api.PagesForPageSelection(pageCount, pageSelection, false, true) 85 if err != nil { 86 t.Fatalf("testSelectedPages(%s) %v\n", s, err) 87 } 88 89 resultString := selectedPagesString(selectedPages, pageCount) 90 91 if resultString != compareString { 92 t.Fatalf("testSelectedPages(%s) expected:%s got%s\n", s, compareString, resultString) 93 } 94 } 95 96 func TestSelectedPages(t *testing.T) { 97 pageCount := 5 98 99 testSelectedPages("even", pageCount, "01010", t) 100 testSelectedPages("even,even", pageCount, "01010", t) 101 testSelectedPages("odd", pageCount, "10101", t) 102 testSelectedPages("odd,odd", pageCount, "10101", t) 103 testSelectedPages("even,odd", pageCount, "11111", t) 104 testSelectedPages("odd,!1", pageCount, "00101", t) 105 testSelectedPages("odd,n1", pageCount, "00101", t) 106 testSelectedPages("!1,odd", pageCount, "00101", t) 107 testSelectedPages("n1,odd", pageCount, "00101", t) 108 testSelectedPages("!1,odd,even", pageCount, "01111", t) 109 110 testSelectedPages("1", pageCount, "10000", t) 111 testSelectedPages("2", pageCount, "01000", t) 112 testSelectedPages("3", pageCount, "00100", t) 113 testSelectedPages("4", pageCount, "00010", t) 114 testSelectedPages("5", pageCount, "00001", t) 115 testSelectedPages("6", pageCount, "00000", t) 116 117 testSelectedPages("-3", pageCount, "11100", t) 118 testSelectedPages("3-", pageCount, "00111", t) 119 testSelectedPages("2-4", pageCount, "01110", t) 120 121 testSelectedPages("-2,4-", pageCount, "11011", t) 122 testSelectedPages("2-4,!3", pageCount, "01010", t) 123 testSelectedPages("-4,n2", pageCount, "10110", t) 124 125 testSelectedPages("5-7", pageCount, "00001", t) 126 testSelectedPages("4-", pageCount, "00011", t) 127 testSelectedPages("5-", pageCount, "00001", t) 128 testSelectedPages("!4", pageCount, "00000", t) 129 130 testSelectedPages("-l", pageCount, "11111", t) 131 testSelectedPages("-l-1", pageCount, "11110", t) 132 testSelectedPages("2-l", pageCount, "01111", t) 133 testSelectedPages("2-l-2", pageCount, "01100", t) 134 testSelectedPages("2-l-3", pageCount, "01000", t) 135 testSelectedPages("2-l-4", pageCount, "00000", t) 136 testSelectedPages("!l", pageCount, "00000", t) 137 testSelectedPages("nl", pageCount, "00000", t) 138 testSelectedPages("!l-2", pageCount, "00000", t) 139 testSelectedPages("nl-2", pageCount, "00000", t) 140 testSelectedPages("l", pageCount, "00001", t) 141 testSelectedPages("l-1", pageCount, "00010", t) 142 testSelectedPages("l-1-", pageCount, "00011", t) 143 testSelectedPages("!l,odd", pageCount, "10100", t) 144 testSelectedPages("l,even", pageCount, "01011", t) 145 146 testSelectedPages("1-l,!2-l-1", pageCount, "10001", t) 147 testSelectedPages("1-l,!2-l-1", pageCount, "10001", t) 148 } 149 150 func collectedPagesString(cp []int) string { 151 return fmt.Sprint(cp) 152 } 153 154 func testCollectedPages(s string, pageCount int, want string, t *testing.T) { 155 pageSelection, err := api.ParsePageSelection(s) 156 if err != nil { 157 t.Fatalf("testCollectedPages(%s) %v\n", s, err) 158 } 159 160 collectedPages, err := api.PagesForPageCollection(pageCount, pageSelection) 161 if err != nil { 162 t.Fatalf("testCollectedPages(%s) %v\n", s, err) 163 } 164 165 got := collectedPagesString(collectedPages) 166 //fmt.Printf("%s\n", resultString) 167 168 if got != want { 169 t.Fatalf("testCollectedPages(%s) want:%s got%s\n", s, want, got) 170 } 171 } 172 173 func TestCollectedPages(t *testing.T) { 174 pageCount := 5 175 176 testCollectedPages("even", pageCount, "[2 4]", t) 177 testCollectedPages("even,even", pageCount, "[2 4 2 4]", t) 178 testCollectedPages("odd", pageCount, "[1 3 5]", t) 179 testCollectedPages("odd,odd", pageCount, "[1 3 5 1 3 5]", t) 180 testCollectedPages("even,odd", pageCount, "[2 4 1 3 5]", t) 181 testCollectedPages("odd,!1", pageCount, "[3 5]", t) 182 testCollectedPages("odd,n1", pageCount, "[3 5]", t) 183 testCollectedPages("!1,odd", pageCount, "[1 3 5]", t) 184 testCollectedPages("n1,odd", pageCount, "[1 3 5]", t) 185 testCollectedPages("!1,odd,even", pageCount, "[1 3 5 2 4]", t) 186 187 testCollectedPages("1", pageCount, "[1]", t) 188 testCollectedPages("2", pageCount, "[2]", t) 189 testCollectedPages("3", pageCount, "[3]", t) 190 testCollectedPages("4", pageCount, "[4]", t) 191 testCollectedPages("5", pageCount, "[5]", t) 192 193 testCollectedPages("-3", pageCount, "[1 2 3]", t) 194 testCollectedPages("3-", pageCount, "[3 4 5]", t) 195 testCollectedPages("2-4", pageCount, "[2 3 4]", t) 196 197 testCollectedPages("-2,4-", pageCount, "[1 2 4 5]", t) 198 testCollectedPages("2-4,!3", pageCount, "[2 4]", t) 199 testCollectedPages("-4,n2", pageCount, "[1 3 4]", t) 200 201 testCollectedPages("5-7", pageCount, "[5]", t) 202 testCollectedPages("4-", pageCount, "[4 5]", t) 203 testCollectedPages("5-", pageCount, "[5]", t) 204 205 testCollectedPages("-l", pageCount, "[1 2 3 4 5]", t) 206 testCollectedPages("-l-1", pageCount, "[1 2 3 4]", t) 207 testCollectedPages("2-l", pageCount, "[2 3 4 5]", t) 208 testCollectedPages("2-l-2", pageCount, "[2 3]", t) 209 testCollectedPages("2-l-3", pageCount, "[2]", t) 210 testCollectedPages("l", pageCount, "[5]", t) 211 testCollectedPages("l-1", pageCount, "[4]", t) 212 testCollectedPages("l-1-", pageCount, "[4 5]", t) 213 testCollectedPages("!l,odd", pageCount, "[1 3 5]", t) 214 testCollectedPages("l,even", pageCount, "[5 2 4]", t) 215 216 testCollectedPages("1-3,2,1,l", pageCount, "[1 2 3 2 1 5]", t) 217 testCollectedPages("1,1,1,l,l,l", pageCount, "[1 1 1 5 5 5]", t) 218 testCollectedPages("1-3,2-4,3-", pageCount, "[1 2 3 2 3 4 3 4 5]", t) 219 testCollectedPages("1-3,2-4,!3", pageCount, "[1 2 2 4]", t) 220 221 testCollectedPages("1-,!l", pageCount, "[1 2 3 4]", t) 222 testCollectedPages("1-,nl", pageCount, "[1 2 3 4]", t) 223 }