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  }