#
# IPP/1.1 test suite.
#
# Copyright © 2022-2024 by OpenPrinting.
# Copyright © 2007-2017 by Apple Inc.
# Copyright © 2001-2006 by Easy Software Products. All rights reserved.
#
# Licensed under Apache License v2.0.  See the file "LICENSE" for more
# information.
#
# Usage:
#
#   ipptool [OPTIONS] -tf FILENAME PRINTER-URI ipp-1.1.test
#
# Options:
#
#   -d document-uri=SOMEURI   Specify a URI for print-by-reference tests
#   -d NOPRINT=1              Disable the print tests.
#   -d REQUIRE_MSN=1          Require support for the MSN v2.1 specification.
#

# Regular expressions for URI schemes:
#
#   HTTP_URI_REGEX - Matches strings beginning with http:// or https://
#   IPP_URI_REGEX  - Matches strings beginning with ipp:// or ipps://

DEFINE HTTP_URI_REGEX "/^https?://.+$$/"
DEFINE IPP_URI_REGEX "/^ipps?://.+$$/"


# Test that a request-id value of 0 is not accepted.
#
# Required by: RFC 8011 section 4.1.1
{
    NAME "RFC 8011 section 4.1.1: Bad request-id value 0"
    REQUEST-ID 0
    OPERATION Get-Printer-Attributes
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri

    STATUS client-error-bad-request
    EXPECT !printer-uri-supported
}


# Test that the first two attributes must be attributes-charset and
# attributes-natural-language.
#
# Required by: RFC 8011 section 4.1.4
{
    NAME "RFC 8011 section 4.1.4: No Operation Attributes"
    REQUEST-ID random
    OPERATION Get-Printer-Attributes
    GROUP operation-attributes-tag

    STATUS client-error-bad-request
    EXPECT !printer-uri-supported
}
{
    NAME "RFC 8011 section 4.1.4: attributes-charset"
    OPERATION Get-Printer-Attributes
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR uri printer-uri $uri

    STATUS client-error-bad-request
    EXPECT !printer-uri-supported
}
{
    NAME "RFC 8011 section 4.1.4: attributes-natural-language"
    OPERATION Get-Printer-Attributes
    GROUP operation-attributes-tag
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri

    STATUS client-error-bad-request
    EXPECT !printer-uri-supported
}
{
    NAME "RFC 8011 section 4.1.4: attributes-natural-language + attributes-charset"
    OPERATION Get-Printer-Attributes
    GROUP operation-attributes-tag
    ATTR naturalLanguage attributes-natural-language en
    ATTR charset attributes-charset utf-8
    ATTR uri printer-uri $uri

    STATUS client-error-bad-request
    EXPECT !printer-uri-supported
}
{
    NAME "RFC 8011 section 4.1.4: attributes-charset + attributes-natural-language"
    OPERATION Get-Printer-Attributes
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri

    STATUS successful-ok
    EXPECT printer-uri-supported OF-TYPE uri WITH-ALL-VALUES "$IPP_URI_REGEX"
}


# Test that bad IPP versions are not supported.
#
# Required by: RFC 8011 section 4.1.8
{
    # The name of the test...
    NAME "RFC 8011 section 4.1.8: Unsupported IPP version 0.0"
    VERSION 0.0
    OPERATION Get-Printer-Attributes
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri

    STATUS server-error-version-not-supported
    EXPECT !printer-uri-supported
}


# Test that printer operations require the printer-uri operation attribute.
#
# Required by: RFC 8011 section 4.2
{
    NAME "RFC 8011 section 4.2: No printer-uri operation attribute"
    OPERATION Get-Printer-Attributes
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en

    STATUS client-error-bad-request
    EXPECT !printer-uri-supported
}


# Test Print-Job operation
#
# Required by: RFC 8011 section 4.2.1
{
    NAME "RFC 8011 section 4.2.1: Print-Job Operation"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name $filename
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name $filename
    ATTR keyword compression none
    ATTR mimeMediaType document-format $filetype
    FILE $filename

    STATUS successful-ok
    STATUS client-error-document-format-not-supported
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state WITH-VALUE 7,8,9 DEFINE-MATCH PRINT_JOB_COMPLETED
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}


# Test Validate-Job operation
#
# Required by: RFC 8011 section 4.2.3
{
    NAME "RFC 8011 section 4.2.3: Validate-Job Operation"
    OPERATION Validate-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name $filename
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name $filename
    ATTR keyword compression none
    ATTR mimeMediaType document-format $filetype

    STATUS successful-ok
}


# Test Get-Printer-Attributes operation
#
# Required by: RFC 8011 section 4.2.5
{
    NAME "RFC 8011 section 4.2.5: Get-Printer-Attributes Operation (default)"
    OPERATION Get-Printer-Attributes
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR mimeMediaType document-format $filetype

    STATUS successful-ok

    # Display some useful information to identify the test
    DISPLAY color-supported
    DISPLAY compression-supported
    DISPLAY document-format-supported
    DISPLAY ipp-versions-supported
    DISPLAY media-supported
    DISPLAY operations-supported
    DISPLAY pages-per-minute
    DISPLAY pages-per-minute-color
    DISPLAY print-quality-supported
    DISPLAY printer-info
    DISPLAY printer-location
    DISPLAY printer-make-and-model
    DISPLAY printer-name
    DISPLAY printer-uri-supported
    DISPLAY uri-authentication-supported
    DISPLAY uri-security-supported

    # Operations
    EXPECT operations-supported OF-TYPE enum IN-GROUP printer-attributes-tag
    EXPECT operations-supported WITH-VALUE 0x0002 # Print-Job
    EXPECT operations-supported WITH-VALUE 0x0003 DEFINE-MATCH PRINTER_HAS_PRINT_URI # Print-URI
    EXPECT operations-supported WITH-VALUE 0x0004 # Validate-Job
    EXPECT operations-supported WITH-VALUE 0x0005 DEFINE-MATCH PRINTER_HAS_CREATE_JOB # Create-Job
    EXPECT operations-supported WITH-VALUE 0x0006 DEFINE-MATCH PRINTER_HAS_SEND_DOCUMENT # Send-Document
    EXPECT operations-supported WITH-VALUE 0x0006 IF-DEFINED PRINTER_HAS_CREATE_JOB # Must have Send-Document, too
    EXPECT operations-supported WITH-VALUE 0x0005 IF-DEFINED PRINTER_HAS_SEND_DOCUMENT # Must have Create-Job, too
    EXPECT operations-supported WITH-VALUE 0x0007 DEFINE-MATCH PRINTER_HAS_SEND_URI # Send-URI
    EXPECT operations-supported WITH-VALUE 0x0005 IF-DEFINED PRINTER_HAS_SEND_URI # Must have Create-Job, too
    EXPECT operations-supported WITH-VALUE 0x0008 # Cancel-Job
    EXPECT operations-supported WITH-VALUE 0x0009 # Get-Job-Attributes
    EXPECT operations-supported WITH-VALUE 0x000a # Get-Jobs
    EXPECT operations-supported WITH-VALUE 0x000b # Get-Printer-Attributes
    EXPECT operations-supported WITH-VALUE 0x000c DEFINE-MATCH PRINTER_HAS_HOLD_JOB # Hold-Job
    EXPECT operations-supported WITH-VALUE 0x000d IF-DEFINED PRINTER_HAS_HOLD_JOB # Must have Release-Job, too
    EXPECT operations-supported WITH-VALUE 0x000d DEFINE-MATCH PRINTER_HAS_RELEASE_JOB # Release-Job
    EXPECT operations-supported WITH-VALUE 0x000c IF-DEFINED PRINTER_HAS_RELEASE_JOB # Must have Hold-Job, too
    EXPECT operations-supported WITH-VALUE 0x000e DEFINE-MATCH PRINTER_HAS_RESTART_JOB # Restart-Job
    EXPECT operations-supported WITH-VALUE 0x0010 DEFINE-MATCH PRINTER_HAS_PAUSE_PRINTER # Pause-Printer
    EXPECT operations-supported WITH-VALUE 0x0011 IF-DEFINED PRINTER_HAS_PAUSE_PRINTER # Must have Resume-Printer, too
    EXPECT operations-supported WITH-VALUE 0x0011 DEFINE-MATCH PRINTER_HAS_RESUME_PRINTER # Resume-Printer
    EXPECT operations-supported WITH-VALUE 0x0010 IF-DEFINED PRINTER_HAS_RESUME_PRINTER # Must have Pause-Printer, too
    EXPECT operations-supported WITH-VALUE 0x0012 DEFINE-MATCH PRINTER_HAS_PURGE_JOBS # Purge-Jobs

    # Job template attributes
    EXPECT copies-supported DEFINE-MATCH PRINTER_HAS_COPIES
    EXPECT copies-default IF-DEFINED PRINTER_HAS_COPIES
    EXPECT ?copies-default OF-TYPE integer(1:MAX) IN-GROUP printer-attributes-tag COUNT 1
    EXPECT ?copies-supported OF-TYPE rangeOfInteger(1:MAX) IN-GROUP printer-attributes-tag

    EXPECT finishings-supported DEFINE-MATCH PRINTER_HAS_FINISHINGS
    EXPECT finishings-default IF-DEFINED PRINTER_HAS_FINISHINGS
    EXPECT ?finishings-default OF-TYPE enum IN-GROUP printer-attributes-tag WITH-ALL-VALUES-FROM finishings-supported
    EXPECT ?finishings-supported OF-TYPE enum IN-GROUP printer-attributes-tag WITH-VALUE 3

    EXPECT job-hold-until-supported DEFINE-MATCH PRINTER_HAS_JOB_HOLD_UNTIL
    EXPECT job-hold-until-default IF-DEFINED PRINTER_HAS_JOB_HOLD_UNTIL
    EXPECT job-hold-until-default IF-DEFINED PRINTER_HAS_HOLD_JOB
    EXPECT job-hold-until-supported IF-DEFINED PRINTER_HAS_HOLD_JOB
    EXPECT ?job-hold-until-default OF-TYPE keyword|name IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE-FROM job-hold-until-supported
    EXPECT ?job-hold-until-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag
    EXPECT ?job-hold-until-supported WITH-VALUE indefinite
    EXPECT ?job-hold-until-supported WITH-VALUE no-hold

    EXPECT job-priority-supported DEFINE-MATCH PRINTER_HAS_JOB_PRIORITY
    EXPECT job-priority-default IF-DEFINED PRINTER_HAS_JOB_PRIORITY
    EXPECT ?job-priority-default OF-TYPE integer(1:100) IN-GROUP printer-attributes-tag COUNT 1
    EXPECT ?job-priority-supported OF-TYPE integer(1:100) IN-GROUP printer-attributes-tag COUNT 1

    EXPECT job-sheets-supported DEFINE-MATCH PRINTER_HAS_JOB_SHEETS
    EXPECT job-sheets-default IF-DEFINED PRINTER_HAS_JOB_SHEETS
    EXPECT ?job-sheets-default OF-TYPE keyword|name IN-GROUP printer-attributes-tag WITH-VALUE-FROM job-sheets-supported
    EXPECT ?job-sheets-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag
    EXPECT ?job-sheets-supported WITH-VALUE none
    EXPECT ?job-sheets-supported WITH-VALUE standard

    EXPECT media-supported DEFINE-MATCH PRINTER_HAS_MEDIA
    EXPECT media-default IF-DEFINED PRINTER_HAS_MEDIA
    EXPECT ?media-default OF-TYPE no-value|keyword|name IN-GROUP printer-attributes-tag COUNT 1
    EXPECT ?media-ready OF-TYPE keyword|name IN-GROUP printer-attributes-tag
    EXPECT ?media-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag

    EXPECT multiple-document-handling-supported DEFINE-MATCH PRINTER_HAS_MULTIPLE_DOCUMENT_HANDLING
    EXPECT multiple-document-handling-default IF-DEFINED PRINTER_HAS_MULTIPLE_DOCUMENT_HANDLING
    EXPECT ?multiple-document-handling-default OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE-FROM multiple-document-handling-supported
    EXPECT ?multiple-document-handling-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "/^(separate-documents-collated-copies|separate-documents-uncollated-copies|single-document|single-document-new-sheet)$$/"

    EXPECT number-up-supported DEFINE-MATCH PRINTER_HAS_NUMBER_UP
    EXPECT number-up-default IF-DEFINED PRINTER_HAS_NUMBER_UP
    EXPECT ?number-up-default OF-TYPE integer(1:MAX) IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE-FROM number-up-supported
    EXPECT ?number-up-supported OF-TYPE integer(1:MAX)|rangeOfInteger(1:MAX) IN-GROUP printer-attributes-tag
    EXPECT ?number-up-supported WITH-VALUE 1

    EXPECT orientation-requested-supported DEFINE-MATCH PRINTER_HAS_ORIENTATION_REQUESTED
    EXPECT orientation-requested-default IF-DEFINED PRINTER_HAS_ORIENTATION_REQUESTED
    EXPECT ?orientation-requested-default OF-TYPE no-value|enum IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE-FROM orientation-requested-supported
    EXPECT ?orientation-requested-supported OF-TYPE enum IN-GROUP printer-attributes-tag WITH-ALL-VALUES 3,4,5,6,7

    EXPECT ?pages-ranges-supported OF-TYPE boolean IN-GROUP printer-attributes-tag

    EXPECT print-quality-supported DEFINE-MATCH PRINTER_HAS_PRINT_QUALITY
    EXPECT print-quality-default IF-DEFINED PRINTER_HAS_PRINT_QUALILTY
    EXPECT ?print-quality-default OF-TYPE enum IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE-FROM print-quality-supported
    EXPECT ?print-quality-supported OF-TYPE enum IN-GROUP printer-attributes-tag WITH-ALL-VALUES 3,4,5

    EXPECT printer-resolution-supported DEFINE-MATCH PRINTER_HAS_PRINTER_RESOLUTION
    EXPECT printer-resolution-default IF-DEFINED PRINTER_HAS_PRINTER_RESOLUTION
    EXPECT ?printer-resolution-default OF-TYPE resolution IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE-FROM printer-resolution-supported
    EXPECT ?printer-resolution-supported OF-TYPE resolution IN-GROUP printer-attributes-tag

    EXPECT sides-supported DEFINE-MATCH PRINTER_HAS_SIDES
    EXPECT sides-default IF-DEFINED PRINTER_HAS_SIDES
    EXPECT ?sides-default OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE-FROM sides-supported
    EXPECT ?sides-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-ALL-VALUES "/^(one-sided|two-sided-long-edge|two-sided-short-edge)$$/"

    # Printer description attributes
    EXPECT charset-configured OF-TYPE charset IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE-FROM charset-supported
    EXPECT charset-supported OF-TYPE charset IN-GROUP printer-attributes-tag WITH-VALUE utf-8

    EXPECT ?color-supported OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1

    EXPECT compression-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE none

    EXPECT document-format-default OF-TYPE mimeMediaType IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE-FROM document-format-supported
    EXPECT document-format-supported OF-TYPE mimeMediaType IN-GROUP printer-attributes-tag

    EXPECT generated-natural-language-supported OF-TYPE naturalLanguage IN-GROUP printer-attributes-tag

    EXPECT ipp-versions-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "1.1"

    EXPECT ?job-impressions-supported OF-TYPE rangeOfInteger(0:MAX) IN-GROUP printer-attributes-tag COUNT 1

    EXPECT ?job-k-octets-supported OF-TYPE rangeOfInteger(0:MAX) IN-GROUP printer-attributes-tag COUNT 1

    EXPECT ?job-media-sheets-supported OF-TYPE rangeOfInteger(0:MAX) IN-GROUP printer-attributes-tag COUNT 1

    EXPECT ?multiple-document-jobs-supported OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1

    EXPECT ?multiple-operation-time-out OF-TYPE integer(1:MAX) IN-GROUP printer-attributes-tag COUNT 1

    EXPECT natural-language-configured OF-TYPE naturalLanguage IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE-FROM generated-natural-language-supported

    EXPECT ?pages-per-minute OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1
    EXPECT ?pages-per-minute-color OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1

    EXPECT pdl-override-supported OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1

    EXPECT ?printer-current-time OF-TYPE dateTime IN-GROUP printer-attributes-tag COUNT 1

    EXPECT ?printer-driver-installer OF-TYPE uri IN-GROUP printer-attributes-tag COUNT 1

    EXPECT ?printer-info OF-TYPE text(127) IN-GROUP printer-attributes-tag COUNT 1

    EXPECT printer-is-accepting-jobs OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1

    EXPECT ?printer-location OF-TYPE text(127) IN-GROUP printer-attributes-tag COUNT 1

    EXPECT ?printer-make-and-model OF-TYPE text(127) IN-GROUP printer-attributes-tag COUNT 1

    EXPECT ?printer-message-from-operator OF-TYPE text(127) IN-GROUP printer-attributes-tag COUNT 1

    EXPECT ?printer-more-info OF-TYPE uri IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "$HTTP_URI_REGEX"

    EXPECT ?printer-more-info-manufacturer OF-TYPE uri IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "$HTTP_URI_REGEX"

    EXPECT printer-name OF-TYPE name(127) IN-GROUP printer-attributes-tag COUNT 1

    EXPECT printer-state OF-TYPE enum IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE 3,4,5

    EXPECT ?printer-state-message OF-TYPE text IN-GROUP printer-attributes-tag

    EXPECT printer-state-reasons OF-TYPE keyword IN-GROUP printer-attributes-tag

    EXPECT printer-up-time OF-TYPE integer(1:MAX) IN-GROUP printer-attributes-tag COUNT 1

    EXPECT printer-uri-supported OF-TYPE uri IN-GROUP printer-attributes-tag SAME-COUNT-AS uri-security-supported WITH-ALL-VALUES "$IPP_URI_REGEX"

    EXPECT queued-job-count OF-TYPE integer(0:MAX) IN-GROUP printer-attributes-tag COUNT 1

    EXPECT ?reference-uri-schemes-supported OF-TYPE uriScheme IN-GROUP printer-attributes-tag
    EXPECT reference-uri-schemes-supported WITH-VALUE "ftp" IF-DEFINED PRINTER_HAS_PRINT_URI
    EXPECT reference-uri-schemes-supported WITH-VALUE "ftp" IF-DEFINED PRINTER_HAS_SEND_URI IF-NOT-DEFINED PRINTER_HAS_PRINT_URI

    EXPECT uri-authentication-supported OF-TYPE keyword IN-GROUP printer-attributes-tag

    EXPECT uri-security-supported OF-TYPE keyword IN-GROUP printer-attributes-tag SAME-COUNT-AS uri-authentication-supported

    # Job template attributes for specific tests...
    EXPECT copies-supported WITH-VALUE >1 DEFINE-MATCH PRINTER_HAS_COPIES
    EXPECT document-format-supported WITH-VALUE "application/pdf" DEFINE-MATCH PRINTER_HAS_PDF
    EXPECT document-format-supported WITH-VALUE "application/postscript" DEFINE-MATCH PRINTER_HAS_POSTSCRIPT
    EXPECT document-format-supported WITH-VALUE "image/jpeg" DEFINE-MATCH PRINTER_HAS_JPEG
    EXPECT job-sheets-supported WITH-VALUE "standard" DEFINE-MATCH PRINTER_HAS_STANDARD_SHEET
    EXPECT media-supported WITH-VALUE "a4" DEFINE-VALUE PRINTER_HAS_A4_MEDIA
    EXPECT media-supported WITH-VALUE "iso-a4" DEFINE-VALUE PRINTER_HAS_A4_MEDIA
    EXPECT media-supported WITH-VALUE "iso_a4_210x297mm" DEFINE-VALUE PRINTER_HAS_A4_MEDIA
    EXPECT media-supported WITH-VALUE "letter" DEFINE-VALUE PRINTER_HAS_LETTER_MEDIA
    EXPECT media-supported WITH-VALUE "na-letter" DEFINE-VALUE PRINTER_HAS_LETTER_MEDIA
    EXPECT media-supported WITH-VALUE "na_letter_8.5x11in" DEFINE-VALUE PRINTER_HAS_LETTER_MEDIA
    EXPECT media-supported WITH-VALUE "index-4x6" DEFINE-VALUE PRINTER_HAS_4X6_MEDIA
    EXPECT media-supported WITH-VALUE "na_index-4x6_4x6in" DEFINE-VALUE PRINTER_HAS_4X6_MEDIA
    EXPECT number-up-supported WITH-VALUE 2 DEFINE-MATCH PRINTER_HAS_2UP
    EXPECT print-quality WITH-VALUE 3 DEFINE-MATCH PRINTER_HAS_DRAFT_QUALITY
    EXPECT print-quality WITH-VALUE 4 DEFINE-MATCH PRINTER_HAS_NORMAL_QUALITY
    EXPECT print-quality WITH-VALUE 5 DEFINE-MATCH PRINTER_HAS_BEST_QUALITY
    EXPECT sides-supported WITH-VALUE "two-sided-long-edge" DEFINE-MATCH PRINTER_HAS_DUPLEX
}


# PWG 5101.1-2023: Media Standardized Names v2.1 (MSN)
INCLUDE "pwg5101.1.test"


# Test Get-Printer-Attributes operation with requested-attributes
#
# Required by: RFC 8011 section 4.2.5
{
    NAME "RFC 8011 section 4.2.5: Get-Printer-Attributes Operation (requested-attributes)"
    OPERATION Get-Printer-Attributes
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR mimeMediaType document-format $filetype
    ATTR keyword requested-attributes printer-uri-supported

    STATUS successful-ok

    EXPECT printer-uri-supported OF-TYPE uri IN-GROUP printer-attributes-tag WITH-ALL-VALUES "$IPP_URI_REGEX"
    EXPECT !printer-name
}


# Test Get-Jobs operation
#
# Required by: RFC 8011 section 4.2.6
{
    NAME "RFC 8011 section 4.2.6: Get-Jobs Operation (default)"
    OPERATION Get-Jobs
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user

    STATUS successful-ok
    EXPECT ?job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
    EXPECT ?job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_REGEX"
    EXPECT !job-printer-uri
    EXPECT !job-more-info
    EXPECT !job-name
    EXPECT !job-originating-user-name
    EXPECT !job-state
    EXPECT !job-state-reasons
    EXPECT !job-state-message
    EXPECT !job-detailed-status-messages
    EXPECT !number-of-documents
    EXPECT !output-device-assigned
    EXPECT !time-at-creation
    EXPECT !time-at-processing
    EXPECT !time-at-completed
    EXPECT !job-printer-up-time
    EXPECT !date-time-at-creation
    EXPECT !date-time-at-processing
    EXPECT !date-time-at-completed
    EXPECT !number-of-intervening-jobs
    EXPECT !job-message-from-operator
    EXPECT !job-k-octets
    EXPECT !job-impressions
    EXPECT !job-media-sheets
    EXPECT !job-k-octets-processed
    EXPECT !job-impressions-completed
    EXPECT !job-media-sheets-completed

    EXPECT !copies
    EXPECT !finishings
    EXPECT !job-hold-until
    EXPECT !job-priority
    EXPECT !job-sheets
    EXPECT !media
    EXPECT !multiple-document-handling
    EXPECT !number-up
    EXPECT !orientation-requested
    EXPECT !pages-ranges
    EXPECT !print-quality
    EXPECT !printer-resolution
    EXPECT !sides
}


# Test Get-Jobs operation
#
# Required by: RFC 8011 section 4.2.6
{
    SKIP-IF-DEFINED PRINT_JOB_COMPLETED

    NAME "RFC 8011 section 4.2.6: Get-Jobs Operation (requested-attributes)"
    OPERATION Get-Jobs
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR keyword requested-attributes all

    STATUS successful-ok
    EXPECT ?job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
    EXPECT ?job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_REGEX"
    EXPECT ?job-printer-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_REGEX"
    EXPECT ?job-more-info OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$HTTP_URI_REGEX"
    EXPECT ?job-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-originating-user-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-state OF-TYPE unknown|enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >2,<10
    EXPECT ?job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-detailed-status-messages OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-documents OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?output-device-assigned OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?time-at-creation OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
    EXPECT ?time-at-processing OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
    EXPECT ?time-at-completed OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
    EXPECT ?job-printer-up-time OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?date-time-at-creation OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?date-time-at-processing OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?date-time-at-completed OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?number-of-intervening-jobs OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-message-from-operator OF-TYPE text IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-k-octets OF-TYPE integer|no-value IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-impressions OF-TYPE integer|no-value IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-media-sheets OF-TYPE integer|no-value IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-k-octets-processed OF-TYPE integer|no-value IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-impressions-completed OF-TYPE integer|no-value IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-media-sheets-completed OF-TYPE integer|no-value IN-GROUP job-attributes-tag COUNT 1

    EXPECT ?copies OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
    EXPECT ?finishings OF-TYPE enum IN-GROUP job-attributes-tag
    EXPECT ?job-hold-until OF-TYPE keyword|name IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-priority OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0,<101
    EXPECT ?job-sheets OF-TYPE keyword|name IN-GROUP job-attributes-tag
    EXPECT ?media OF-TYPE keyword|name IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?multiple-document-handling OF-TYPE keyword IN-GROUP job-attributes-tag WITH-VALUE "/^(single-document|separate-documents-uncollated-copies|separate-documents-collated-copies|single-document-new-sheet)$$/"
    EXPECT ?number-up OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
    EXPECT ?orientation-requested OF-TYPE enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE 3,4,5,6
    EXPECT ?pages-ranges OF-TYPE rangeOfInteger IN-GROUP job-attributes-tag
    EXPECT ?print-quality OF-TYPE enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE 3,4,5
    EXPECT ?printer-resolution OF-TYPE resolution IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?sides OF-TYPE keyword IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "/^(one-sided|two-sided-long-edge|two-sided-short-edge)$$/"
}


# Test Get-Jobs operation
#
# Required by: RFC 8011 section 4.2.6
{
    SKIP-IF-DEFINED PRINT_JOB_COMPLETED

    NAME "RFC 8011 section 4.2.6: Get-Jobs Operation (my-jobs)"
    OPERATION Get-Jobs
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR boolean my-jobs true

    STATUS successful-ok
    EXPECT ?job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
    EXPECT ?job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_REGEX"
    EXPECT !job-printer-uri
    EXPECT !job-more-info
    EXPECT !job-name
    EXPECT !job-originating-user-name
    EXPECT !job-state
    EXPECT !job-state-reasons
    EXPECT !job-state-message
    EXPECT !job-detailed-status-messages
    EXPECT !number-of-documents
    EXPECT !output-device-assigned
    EXPECT !time-at-creation
    EXPECT !time-at-processing
    EXPECT !time-at-completed
    EXPECT !job-printer-up-time
    EXPECT !date-time-at-creation
    EXPECT !date-time-at-processing
    EXPECT !date-time-at-completed
    EXPECT !number-of-intervening-jobs
    EXPECT !job-message-from-operator
    EXPECT !job-k-octets
    EXPECT !job-impressions
    EXPECT !job-media-sheets
    EXPECT !job-k-octets-processed
    EXPECT !job-impressions-completed
    EXPECT !job-media-sheets-completed

    EXPECT !copies
    EXPECT !finishings
    EXPECT !job-hold-until
    EXPECT !job-priority
    EXPECT !job-sheets
    EXPECT !media
    EXPECT !multiple-document-handling
    EXPECT !number-up
    EXPECT !orientation-requested
    EXPECT !pages-ranges
    EXPECT !print-quality
    EXPECT !printer-resolution
    EXPECT !sides
}


# Test Get-Jobs operation
#
# Required by: RFC 8011 section 4.2.6
{
    SKIP-IF-DEFINED PRINT_JOB_COMPLETED

    # Skip this test when doing authenticated printing since we'll always
    # use the authenticated username over the requesting-user-name value.
    SKIP-IF-DEFINED uriuser

    NAME "RFC 8011 section 4.2.6: Get-Jobs Operation (my-jobs different user)"
    OPERATION Get-Jobs
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name not-$user
    ATTR boolean my-jobs true

    STATUS successful-ok
    EXPECT !job-id
    EXPECT !job-uri
    EXPECT !job-printer-uri
    EXPECT !job-more-info
    EXPECT !job-name
    EXPECT !job-originating-user-name
    EXPECT !job-state
    EXPECT !job-state-reasons
    EXPECT !job-state-message
    EXPECT !job-detailed-status-messages
    EXPECT !number-of-documents
    EXPECT !output-device-assigned
    EXPECT !time-at-creation
    EXPECT !time-at-processing
    EXPECT !time-at-completed
    EXPECT !job-printer-up-time
    EXPECT !date-time-at-creation
    EXPECT !date-time-at-processing
    EXPECT !date-time-at-completed
    EXPECT !number-of-intervening-jobs
    EXPECT !job-message-from-operator
    EXPECT !job-k-octets
    EXPECT !job-impressions
    EXPECT !job-media-sheets
    EXPECT !job-k-octets-processed
    EXPECT !job-impressions-completed
    EXPECT !job-media-sheets-completed

    EXPECT !copies
    EXPECT !finishings
    EXPECT !job-hold-until
    EXPECT !job-priority
    EXPECT !job-sheets
    EXPECT !media
    EXPECT !multiple-document-handling
    EXPECT !number-up
    EXPECT !orientation-requested
    EXPECT !pages-ranges
    EXPECT !print-quality
    EXPECT !printer-resolution
    EXPECT !sides
}


# Test Get-Jobs operation
#
# Required by: RFC 8011 section 4.2.6
{
    SKIP-IF-DEFINED PRINT_JOB_COMPLETED

    NAME "RFC 8011 section 4.2.6: Get-Jobs Operation (which-jobs=not-completed)"
    OPERATION Get-Jobs
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR keyword which-jobs not-completed

    STATUS successful-ok
    EXPECT ?job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
    EXPECT ?job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_REGEX"
    EXPECT !job-printer-uri
    EXPECT !job-more-info
    EXPECT !job-name
    EXPECT !job-originating-user-name
    EXPECT !job-state
    EXPECT !job-state-reasons
    EXPECT !job-state-message
    EXPECT !job-detailed-status-messages
    EXPECT !number-of-documents
    EXPECT !output-device-assigned
    EXPECT !time-at-creation
    EXPECT !time-at-processing
    EXPECT !time-at-completed
    EXPECT !job-printer-up-time
    EXPECT !date-time-at-creation
    EXPECT !date-time-at-processing
    EXPECT !date-time-at-completed
    EXPECT !number-of-intervening-jobs
    EXPECT !job-message-from-operator
    EXPECT !job-k-octets
    EXPECT !job-impressions
    EXPECT !job-media-sheets
    EXPECT !job-k-octets-processed
    EXPECT !job-impressions-completed
    EXPECT !job-media-sheets-completed

    EXPECT !copies
    EXPECT !finishings
    EXPECT !job-hold-until
    EXPECT !job-priority
    EXPECT !job-sheets
    EXPECT !media
    EXPECT !multiple-document-handling
    EXPECT !number-up
    EXPECT !orientation-requested
    EXPECT !pages-ranges
    EXPECT !print-quality
    EXPECT !printer-resolution
    EXPECT !sides
}


# Wait for job to complete...
{
    SKIP-IF-NOT-DEFINED job-id

    NAME "Get-Job-Attributes Until Job Complete"
    OPERATION Get-Job-Attributes
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR integer job-id $job-id
    ATTR name requesting-user-name $user

    STATUS successful-ok
    EXPECT job-state OF-TYPE unknown|enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >6 REPEAT-NO-MATCH REPEAT-LIMIT 30
    DISPLAY job-state
}


# Test Get-Jobs operation
#
# Required by: RFC 8011 section 4.2.6
{
    NAME "RFC 8011 section 4.2.6: Get-Jobs Operation (which-jobs=completed)"
    OPERATION Get-Jobs
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR keyword which-jobs completed

    STATUS successful-ok
    EXPECT job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
    EXPECT job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_REGEX"
    EXPECT !job-printer-uri
    EXPECT !job-more-info
    EXPECT !job-name
    EXPECT !job-originating-user-name
    EXPECT !job-state
    EXPECT !job-state-reasons
    EXPECT !job-state-message
    EXPECT !job-detailed-status-messages
    EXPECT !number-of-documents
    EXPECT !output-device-assigned
    EXPECT !time-at-creation
    EXPECT !time-at-processing
    EXPECT !time-at-completed
    EXPECT !job-printer-up-time
    EXPECT !date-time-at-creation
    EXPECT !date-time-at-processing
    EXPECT !date-time-at-completed
    EXPECT !number-of-intervening-jobs
    EXPECT !job-message-from-operator
    EXPECT !job-k-octets
    EXPECT !job-impressions
    EXPECT !job-media-sheets
    EXPECT !job-k-octets-processed
    EXPECT !job-impressions-completed
    EXPECT !job-media-sheets-completed

    EXPECT !copies
    EXPECT !finishings
    EXPECT !job-hold-until
    EXPECT !job-priority
    EXPECT !job-sheets
    EXPECT !media
    EXPECT !multiple-document-handling
    EXPECT !number-up
    EXPECT !orientation-requested
    EXPECT !pages-ranges
    EXPECT !print-quality
    EXPECT !printer-resolution
    EXPECT !sides
}


# Test Get-Jobs operation
#
# Required by: RFC 8011 section 4.2.6
{
    SKIP-IF-DEFINED PRINT_JOB_COMPLETED

    NAME "RFC 8011 section 4.2.6: Get-Jobs Operation (which-jobs, requested-attributes)"
    OPERATION Get-Jobs
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR keyword requested-attributes all
    ATTR keyword which-jobs completed

    STATUS successful-ok
    EXPECT job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
    EXPECT job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-printer-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_REGEX"
    EXPECT ?job-more-info OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$HTTP_URI_REGEX"
    EXPECT job-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
    EXPECT job-originating-user-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
    EXPECT job-state OF-TYPE unknown|enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >2,<10
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-detailed-status-messages OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-documents OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?output-device-assigned OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
    EXPECT time-at-creation OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
    EXPECT time-at-processing OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
    EXPECT time-at-completed OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
    EXPECT job-printer-up-time OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?date-time-at-creation OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?date-time-at-processing OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?date-time-at-completed OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?number-of-intervening-jobs OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-message-from-operator OF-TYPE text IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-k-octets OF-TYPE integer|no-value IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-impressions OF-TYPE integer|no-value IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-media-sheets OF-TYPE integer|no-value IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-k-octets-processed OF-TYPE integer|no-value IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-impressions-completed OF-TYPE integer|no-value IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-media-sheets-completed OF-TYPE integer|no-value IN-GROUP job-attributes-tag COUNT 1

    EXPECT ?copies OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
    EXPECT ?finishings OF-TYPE enum IN-GROUP job-attributes-tag
    EXPECT ?job-hold-until OF-TYPE keyword|name IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-priority OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0,<101
    EXPECT ?job-sheets OF-TYPE keyword|name IN-GROUP job-attributes-tag
    EXPECT ?media OF-TYPE keyword|name IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?multiple-document-handling OF-TYPE keyword IN-GROUP job-attributes-tag WITH-VALUE "/^(single-document|separate-documents-uncollated-copies|separate-documents-collated-copies|single-document-new-sheet)$$/"
    EXPECT ?number-up OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
    EXPECT ?orientation-requested OF-TYPE enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE 3,4,5,6
    EXPECT ?pages-ranges OF-TYPE rangeOfInteger IN-GROUP job-attributes-tag
    EXPECT ?print-quality OF-TYPE enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE 3,4,5
    EXPECT ?printer-resolution OF-TYPE resolution IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?sides OF-TYPE keyword IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "/^(one-sided|two-sided-long-edge|two-sided-short-edge)$$/"
}


# Test Cancel-Job operation
#
# Required by: RFC 8011 section 4.3.3
{
    NAME "RFC 8011 section 4.3.3: Cancel-Job Operation (completed job)"
    OPERATION Cancel-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR integer job-id $job-id
    ATTR name requesting-user-name $user

    STATUS client-error-not-possible
}


# Test Print-Job operation
#
# Required by: RFC 8011 section 4.2.1
{
    NAME "RFC 8011 section 4.2.1: Print-Job Operation"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name $filename
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name $filename
    ATTR keyword compression none
    ATTR mimeMediaType document-format $filetype
    FILE $filename

    STATUS successful-ok
    STATUS client-error-document-format-not-supported
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}


# Test Cancel-Job operation
#
# Required by: RFC 8011 section 4.3.3
{
    NAME "RFC 8011 section 4.3.3: Cancel-Job Operation (pending/processing job)"
    OPERATION Cancel-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR integer job-id $job-id
    ATTR name requesting-user-name $user

    STATUS successful-ok
    STATUS client-error-not-possible
}


# Test Get-Job-Attributes operation
#
# Required by: RFC 8011 section 4.3.4
{
    NAME "RFC 8011 section 4.3.4: Get-Job-Attributes Operation"
    OPERATION Get-Job-Attributes
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR integer job-id $job-id
    ATTR name requesting-user-name $user

    STATUS successful-ok
    EXPECT job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
    EXPECT job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-printer-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_REGEX"
    EXPECT ?job-more-info OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$HTTP_URI_REGEX"
    EXPECT job-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
    EXPECT job-originating-user-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
    EXPECT job-state OF-TYPE unknown|enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >2,<10
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-detailed-status-messages OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-documents OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?output-device-assigned OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
    EXPECT time-at-creation OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
    EXPECT time-at-processing OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
    EXPECT time-at-completed OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
    EXPECT job-printer-up-time OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?date-time-at-creation OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?date-time-at-processing OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?date-time-at-completed OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?number-of-intervening-jobs OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-message-from-operator OF-TYPE text IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-k-octets OF-TYPE integer|no-value IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-impressions OF-TYPE integer|no-value IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-media-sheets OF-TYPE integer|no-value IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-k-octets-processed OF-TYPE integer|no-value IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-impressions-completed OF-TYPE integer|no-value IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-media-sheets-completed OF-TYPE integer|no-value IN-GROUP job-attributes-tag COUNT 1

    EXPECT ?copies OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
    EXPECT ?finishings OF-TYPE enum IN-GROUP job-attributes-tag
    EXPECT ?job-hold-until OF-TYPE keyword|name IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?job-priority OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0,<101
    EXPECT ?job-sheets OF-TYPE keyword|name IN-GROUP job-attributes-tag
    EXPECT ?media OF-TYPE keyword|name IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?multiple-document-handling OF-TYPE keyword IN-GROUP job-attributes-tag WITH-VALUE "/^(single-document|separate-documents-uncollated-copies|separate-documents-collated-copies|single-document-new-sheet)$$/"
    EXPECT ?number-up OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
    EXPECT ?orientation-requested OF-TYPE enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE 3,4,5,6
    EXPECT ?pages-ranges OF-TYPE rangeOfInteger IN-GROUP job-attributes-tag
    EXPECT ?print-quality OF-TYPE enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE 3,4,5
    EXPECT ?printer-resolution OF-TYPE resolution IN-GROUP job-attributes-tag COUNT 1
    EXPECT ?sides OF-TYPE keyword IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "/^(one-sided|two-sided-long-edge|two-sided-short-edge)$$/"
}


# Test Print-URI operation
#
# Defined by: RFC 8011 section 4.2.2
{
    SKIP-IF-NOT-DEFINED PRINTER_HAS_PRINT_URI
    SKIP-IF-NOT-DEFINED document-uri

    NAME "RFC 8011 section 4.2.2: Print-URI Operation"
    OPERATION Print-URI
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name $filename
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name $filename
    ATTR keyword compression none
    ATTR uri document-uri $document-uri

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}


# Test Print-URI operation with bad document-uri
#
# Defined by: RFC 8011 section 4.2.2
{
    SKIP-IF-NOT-DEFINED PRINTER_HAS_PRINT_URI
    SKIP-IF-NOT-DEFINED document-uri

    NAME "Print-URI with bad URI: Print-URI Operation"
    OPERATION Print-URI
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name $filename
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name $filename
    ATTR keyword compression none
    ATTR uri document-uri "bogus://bogus"

    STATUS client-error-uri-scheme-not-supported

    EXPECT !job-uri
    EXPECT !job-id
    EXPECT !job-state
    EXPECT !job-state-reasons
    EXPECT !job-state-message
}


# Test Create-Job and Send-Document operations
#
# Defined by: RFC 8011 section 4.2.4 and 4.3.1
{
    SKIP-IF-NOT-DEFINED PRINTER_HAS_CREATE_JOB
    SKIP-IF-NOT-DEFINED PRINTER_HAS_SEND_DOCUMENT

    NAME "RFC 8011 section 4.2.4: Create-Job Operation"
    OPERATION Create-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name $filename
    ATTR boolean ipp-attribute-fidelity false

    STATUS successful-ok
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}

{
    SKIP-IF-NOT-DEFINED PRINTER_HAS_CREATE_JOB
    SKIP-IF-NOT-DEFINED PRINTER_HAS_SEND_DOCUMENT
    SKIP-PREVIOUS-ERROR yes

    NAME "RFC 8011 section 4.3.1: Send-Document Operation"
    OPERATION Send-Document
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR integer job-id $job-id
    ATTR name requesting-user-name $user
    ATTR boolean last-document true
    ATTR name document-name $filename
    ATTR keyword compression none
    ATTR mimeMediaType document-format $filetype
    FILE $filename

    STATUS successful-ok
    STATUS client-error-document-format-not-supported
    STATUS server-error-job-canceled
}

# Test Create-Job and Send-Document operations (no last-document)
#
# Defined by: RFC 8011 section 4.2.4 and 4.3.1
{
    SKIP-IF-NOT-DEFINED PRINTER_HAS_CREATE_JOB
    SKIP-IF-NOT-DEFINED PRINTER_HAS_SEND_DOCUMENT

    NAME "Send-Document missing last-document: Create-Job Operation"
    OPERATION Create-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name $filename
    ATTR boolean ipp-attribute-fidelity false

    STATUS successful-ok
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}

{
    SKIP-IF-NOT-DEFINED PRINTER_HAS_CREATE_JOB
    SKIP-IF-NOT-DEFINED PRINTER_HAS_SEND_DOCUMENT
    SKIP-PREVIOUS-ERROR yes

    NAME "Send-Document missing last-document: Send-Document Operation"
    OPERATION Send-Document
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR integer job-id $job-id
    ATTR name requesting-user-name $user
    ATTR name document-name $filename
    ATTR keyword compression none
    ATTR mimeMediaType document-format $filetype
    FILE $filename

    STATUS client-error-bad-request
}

{
    SKIP-IF-NOT-DEFINED PRINTER_HAS_CREATE_JOB
    SKIP-IF-NOT-DEFINED PRINTER_HAS_SEND_DOCUMENT
    SKIP-PREVIOUS-ERROR yes

    NAME "RFC 8011 section 4.3.3: Cancel-Job Operation"
    OPERATION Cancel-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR integer job-id $job-id
    ATTR name requesting-user-name $user

    STATUS successful-ok
    STATUS server-error-job-canceled
}

# Test Create-Job and Send-URI operations
#
# Defined by: RFC 8011 section 4.2.4 and 4.3.2
{
    SKIP-IF-NOT-DEFINED PRINTER_HAS_CREATE_JOB
    SKIP-IF-NOT-DEFINED PRINTER_HAS_SEND_URI
    SKIP-IF-NOT-DEFINED document-uri

    NAME "RFC 8011 section 4.2.4: Create-Job Operation"
    OPERATION Create-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name $filename
    ATTR boolean ipp-attribute-fidelity false

    STATUS successful-ok
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}

{
    SKIP-IF-NOT-DEFINED PRINTER_HAS_CREATE_JOB
    SKIP-IF-NOT-DEFINED PRINTER_HAS_SEND_URI
    SKIP-IF-NOT-DEFINED document-uri
    SKIP-PREVIOUS-ERROR yes

    NAME "RFC 8011 section 4.3.2: Send-URI Operation"
    OPERATION Send-URI
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR integer job-id $job-id
    ATTR name requesting-user-name $user
    ATTR boolean last-document true
    ATTR name document-name $filename
    ATTR keyword compression none
    ATTR uri document-uri $document-uri

    STATUS successful-ok
    STATUS server-error-job-canceled
}


# Test Create-Job and Send-URI operations (bad URI)
#
# Defined by: RFC 8011 section 4.2.4 and 4.3.2
{
    SKIP-IF-NOT-DEFINED PRINTER_HAS_CREATE_JOB
    SKIP-IF-NOT-DEFINED PRINTER_HAS_SEND_URI

    NAME "Send-URI with bad URI: Create-Job Operation"
    OPERATION Create-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name $filename
    ATTR boolean ipp-attribute-fidelity false

    STATUS successful-ok
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}

{
    SKIP-IF-NOT-DEFINED PRINTER_HAS_CREATE_JOB
    SKIP-IF-NOT-DEFINED PRINTER_HAS_SEND_URI
    SKIP-IF-NOT-DEFINED document-uri
    SKIP-PREVIOUS-ERROR yes

    NAME "Send-URI with bad URI: Send-URI Operation (bad URI)"
    OPERATION Send-URI
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR integer job-id $job-id
    ATTR name requesting-user-name $user
    ATTR boolean last-document true
    ATTR name document-name $filename
    ATTR keyword compression none
    ATTR mimeMediaType document-format $filetype
    ATTR uri document-uri "bogus://bogus"

    STATUS client-error-uri-scheme-not-supported
}

{
    SKIP-IF-NOT-DEFINED PRINTER_HAS_CREATE_JOB
    SKIP-IF-NOT-DEFINED PRINTER_HAS_SEND_URI
    SKIP-PREVIOUS-ERROR yes

    NAME "Send-URI with bad URI: Cancel-Job Operation"
    OPERATION Cancel-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR integer job-id $job-id
    ATTR name requesting-user-name $user

    STATUS successful-ok
    STATUS server-error-job-canceled
}


# Test multiple copy output
{
    SKIP-IF-NOT-DEFINED PRINTER_HAS_COPIES

    NAME "Print-Job with copies"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name $filename
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name $filename
    ATTR keyword compression none
    ATTR mimeMediaType document-format $filetype
    GROUP job-attributes-tag
    ATTR integer copies 2
    FILE $filename

    STATUS successful-ok
    STATUS client-error-document-format-not-supported
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}


# Test PDF output
{
    SKIP-IF-DEFINED NOPRINT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_PDF
    SKIP-IF-NOT-DEFINED PRINTER_HAS_A4_MEDIA

    NAME "Print-Job with A4 PDF"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name "A4 Test Document"
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name document-a4.pdf
    ATTR keyword compression none
    ATTR mimeMediaType document-format application/pdf
    GROUP job-attributes-tag
    ATTR keyword media $PRINTER_HAS_A4_MEDIA
    FILE document-a4.pdf

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}

{
    SKIP-IF-DEFINED NOPRINT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_PDF
    SKIP-IF-NOT-DEFINED PRINTER_HAS_A4_MEDIA
    SKIP-IF-NOT-DEFINED PRINTER_HAS_DUPLEX

    NAME "Print-Job with A4 PDF, Duplex"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name "A4 Test Document, Duplex"
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name document-a4.pdf
    ATTR keyword compression none
    ATTR mimeMediaType document-format application/pdf
    GROUP job-attributes-tag
    ATTR keyword media $PRINTER_HAS_A4_MEDIA
    ATTR keyword sides two-sided-long-edge
    FILE document-a4.pdf

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}

{
    SKIP-IF-DEFINED NOPRINT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_PDF
    SKIP-IF-NOT-DEFINED PRINTER_HAS_LETTER_MEDIA

    NAME "Print-Job with US Letter PDF"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name "US Letter Test Document"
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name document-letter.pdf
    ATTR keyword compression none
    ATTR mimeMediaType document-format application/pdf
    GROUP job-attributes-tag
    ATTR keyword media $PRINTER_HAS_LETTER_MEDIA
    FILE document-letter.pdf

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}

{
    SKIP-IF-DEFINED NOPRINT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_PDF
    SKIP-IF-NOT-DEFINED PRINTER_HAS_LETTER_MEDIA
    SKIP-IF-NOT-DEFINED PRINTER_HAS_DUPLEX

    NAME "Print-Job with US Letter PDF, Duplex"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name "US Letter Test Document, Duplex"
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name document-letter.pdf
    ATTR keyword compression none
    ATTR mimeMediaType document-format application/pdf
    GROUP job-attributes-tag
    ATTR keyword media $PRINTER_HAS_LETTER_MEDIA
    ATTR keyword sides two-sided-long-edge
    FILE document-letter.pdf

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}


# Test PostScript output
{
    SKIP-IF-DEFINED NOPRINT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_POSTSCRIPT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_A4_MEDIA

    NAME "Print-Job with A4 PostScript"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name "A4 Test Document, Duplex"
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name document-a4.ps
    ATTR keyword compression none
    ATTR mimeMediaType document-format application/postscript
    GROUP job-attributes-tag
    ATTR keyword media $PRINTER_HAS_LETTER_MEDIA
    FILE document-a4.ps

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}

{
    SKIP-IF-DEFINED NOPRINT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_POSTSCRIPT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_A4_MEDIA
    SKIP-IF-NOT-DEFINED PRINTER_HAS_DUPLEX

    NAME "Print-Job with A4 PostScript, Duplex"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name "US Letter Test Document"
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name document-a4.ps
    ATTR keyword compression none
    ATTR mimeMediaType document-format application/postscript
    GROUP job-attributes-tag
    ATTR keyword media $PRINTER_HAS_A4_MEDIA
    ATTR keyword sides two-sided-long-edge
    FILE document-a4.ps

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}

{
    SKIP-IF-DEFINED NOPRINT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_POSTSCRIPT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_LETTER_MEDIA

    NAME "Print-Job with US Letter PostScript"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name "US Letter Test Document, Duplex"
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name document-letter.ps
    ATTR keyword compression none
    ATTR mimeMediaType document-format application/postscript
    GROUP job-attributes-tag
    ATTR keyword media $PRINTER_HAS_LETTER_MEDIA
    FILE document-letter.ps

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}

{
    SKIP-IF-DEFINED NOPRINT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_POSTSCRIPT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_LETTER_MEDIA
    SKIP-IF-NOT-DEFINED PRINTER_HAS_DUPLEX

    NAME "Print-Job with US Letter PostScript, Duplex"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name "A4 Test Document"
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name document-letter.ps
    ATTR keyword compression none
    ATTR mimeMediaType document-format application/postscript
    GROUP job-attributes-tag
    ATTR keyword media $PRINTER_HAS_LETTER_MEDIA
    ATTR keyword sides two-sided-long-edge
    FILE document-letter.ps

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}


# Test JPEG output
{
    SKIP-IF-DEFINED NOPRINT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_JPEG
    SKIP-IF-NOT-DEFINED PRINTER_HAS_A4_MEDIA

    NAME "Print-Job with Color JPEG on A4"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name "Color JPEG on A4"
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name color.jpg
    ATTR keyword compression none
    ATTR mimeMediaType document-format image/jpeg
    GROUP job-attributes-tag
    ATTR keyword media $PRINTER_HAS_A4_MEDIA
    FILE color.jpg

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}

{
    SKIP-IF-DEFINED NOPRINT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_JPEG
    SKIP-IF-NOT-DEFINED PRINTER_HAS_LETTER_MEDIA

    NAME "Print-Job with Color JPEG on US Letter"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name "Color JPEG on US Letter"
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name color.jpg
    ATTR keyword compression none
    ATTR mimeMediaType document-format image/jpeg
    GROUP job-attributes-tag
    ATTR keyword media $PRINTER_HAS_LETTER_MEDIA
    FILE color.jpg

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}

{
    SKIP-IF-DEFINED NOPRINT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_JPEG
    SKIP-IF-NOT-DEFINED PRINTER_HAS_4X6_MEDIA

    NAME "Print-Job with Color JPEG on 4x6"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name "Color JPEG on 4x6"
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name color.jpg
    ATTR keyword compression none
    ATTR mimeMediaType document-format image/jpeg
    GROUP job-attributes-tag
    ATTR keyword media $PRINTER_HAS_4X6_MEDIA
    FILE color.jpg

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}

{
    SKIP-IF-DEFINED NOPRINT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_JPEG
    SKIP-IF-NOT-DEFINED PRINTER_HAS_A4_MEDIA

    NAME "Print-Job with Grayscale JPEG on A4"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name "Grayscale JPEG on A4"
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name gray.jpg
    ATTR keyword compression none
    ATTR mimeMediaType document-format image/jpeg
    GROUP job-attributes-tag
    ATTR keyword media $PRINTER_HAS_A4_MEDIA
    FILE gray.jpg

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}

{
    SKIP-IF-DEFINED NOPRINT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_JPEG
    SKIP-IF-NOT-DEFINED PRINTER_HAS_LETTER_MEDIA

    NAME "Print-Job with Grayscale JPEG on US Letter"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name "Grayscale JPEG on US Letter"
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name gray.jpg
    ATTR keyword compression none
    ATTR mimeMediaType document-format image/jpeg
    GROUP job-attributes-tag
    ATTR keyword media $PRINTER_HAS_LETTER_MEDIA
    FILE gray.jpg

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}

{
    SKIP-IF-DEFINED NOPRINT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_JPEG
    SKIP-IF-NOT-DEFINED PRINTER_HAS_4X6_MEDIA

    NAME "Print-Job with Grayscale JPEG on 4x6"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name "Grayscale JPEG on 4x6"
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name gray.jpg
    ATTR keyword compression none
    ATTR mimeMediaType document-format image/jpeg
    GROUP job-attributes-tag
    ATTR keyword media $PRINTER_HAS_4X6_MEDIA
    FILE gray.jpg

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}


# Print-Job with job-sheets
{
    SKIP-IF-DEFINED NOPRINT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_PDF
    SKIP-IF-NOT-DEFINED PRINTER_HAS_A4_MEDIA
    SKIP-IF-NOT-DEFINED PRINTER_HAS_STANDARD_SHEET

    NAME "Print-Job with A4 PDF and Standard Sheet"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name "A4 Test Document w/Standard Sheet"
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name document-a4.pdf
    ATTR keyword compression none
    ATTR mimeMediaType document-format application/pdf
    GROUP job-attributes-tag
    ATTR keyword media $PRINTER_HAS_A4_MEDIA
    ATTR keyword job-sheets standard
    FILE document-a4.pdf

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}

{
    SKIP-IF-DEFINED NOPRINT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_PDF
    SKIP-IF-NOT-DEFINED PRINTER_HAS_LETTER_MEDIA
    SKIP-IF-NOT-DEFINED PRINTER_HAS_STANDARD_SHEET

    NAME "Print-Job with US Letter PDF and Standard Sheet"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name "US Letter Test Document w/Standard Sheet"
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name document-a4.pdf
    ATTR keyword compression none
    ATTR mimeMediaType document-format application/pdf
    GROUP job-attributes-tag
    ATTR keyword media $PRINTER_HAS_LETTER_MEDIA
    ATTR keyword job-sheets standard
    FILE document-a4.pdf

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}

{
    SKIP-IF-DEFINED NOPRINT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_POSTSCRIPT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_A4_MEDIA
    SKIP-IF-NOT-DEFINED PRINTER_HAS_STANDARD_SHEET

    NAME "Print-Job with A4 PDF and Standard Sheet"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name "A4 Test Document w/Standard Sheet"
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name document-a4.ps
    ATTR keyword compression none
    ATTR mimeMediaType document-format application/postscript
    GROUP job-attributes-tag
    ATTR keyword media $PRINTER_HAS_A4_MEDIA
    ATTR keyword job-sheets standard
    FILE document-a4.ps

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}

{
    SKIP-IF-DEFINED NOPRINT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_POSTSCRIPT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_LETTER_MEDIA
    SKIP-IF-NOT-DEFINED PRINTER_HAS_STANDARD_SHEET

    NAME "Print-Job with US Letter PDF and Standard Sheet"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name "US Letter Test Document w/Standard Sheet"
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name document-a4.ps
    ATTR keyword compression none
    ATTR mimeMediaType document-format application/postscript
    GROUP job-attributes-tag
    ATTR keyword media $PRINTER_HAS_LETTER_MEDIA
    ATTR keyword job-sheets standard
    FILE document-a4.ps

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}


# Test number-up output
{
    SKIP-IF-DEFINED NOPRINT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_PDF
    SKIP-IF-NOT-DEFINED PRINTER_HAS_A4_MEDIA
    SKIP-IF-NOT-DEFINED PRINTER_HAS_2UP

    NAME "Print-Job with A4 PDF, 2-Up"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name "A4 Test Document; 2-Up"
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name document-a4.pdf
    ATTR keyword compression none
    ATTR mimeMediaType document-format application/pdf
    GROUP job-attributes-tag
    ATTR keyword media $PRINTER_HAS_A4_MEDIA
    ATTR integer number-up 2
    FILE document-a4.pdf

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}

{
    SKIP-IF-DEFINED NOPRINT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_PDF
    SKIP-IF-NOT-DEFINED PRINTER_HAS_LETTER_MEDIA
    SKIP-IF-NOT-DEFINED PRINTER_HAS_2UP

    NAME "Print-Job with US Letter PDF, 2-Up"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name "US Letter Test Document; 2-Up"
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name document-letter.pdf
    ATTR keyword compression none
    ATTR mimeMediaType document-format application/pdf
    GROUP job-attributes-tag
    ATTR keyword media $PRINTER_HAS_LETTER_MEDIA
    ATTR integer number-up 2
    FILE document-letter.pdf

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}

{
    SKIP-IF-DEFINED NOPRINT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_POSTSCRIPT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_A4_MEDIA
    SKIP-IF-NOT-DEFINED PRINTER_HAS_2UP

    NAME "Print-Job with A4 PDF, 2-Up"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name "A4 Test Document; 2-Up"
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name document-a4.ps
    ATTR keyword compression none
    ATTR mimeMediaType document-format application/postscript
    GROUP job-attributes-tag
    ATTR keyword media $PRINTER_HAS_A4_MEDIA
    ATTR integer number-up 2
    FILE document-a4.ps

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}

{
    SKIP-IF-DEFINED NOPRINT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_POSTSCRIPT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_LETTER_MEDIA
    SKIP-IF-NOT-DEFINED PRINTER_HAS_2UP

    NAME "Print-Job with US Letter PDF, 2-Up"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name "US Letter Test Document; 2-Up"
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name document-letter.ps
    ATTR keyword compression none
    ATTR mimeMediaType document-format application/postscript
    GROUP job-attributes-tag
    ATTR keyword media $PRINTER_HAS_LETTER_MEDIA
    ATTR integer number-up 2
    FILE document-letter.ps

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}


# Test output with print-quality...
{
    SKIP-IF-DEFINED NOPRINT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_JPEG
    SKIP-IF-NOT-DEFINED PRINTER_HAS_4X6_MEDIA
    SKIP-IF-NOT-DEFINED PRINTER_HAS_DRAFT_QUALITY

    NAME "Print-Job with JPEG on 4x6, Draft Quality"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name "4x6 Color JPEG; Draft Quality"
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name color.jpg
    ATTR keyword compression none
    ATTR mimeMediaType document-format image/jpeg
    GROUP job-attributes-tag
    ATTR keyword media $PRINTER_HAS_4X6_MEDIA
    ATTR enum print-quality 3
    FILE color.jpg

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}

{
    SKIP-IF-DEFINED NOPRINT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_JPEG
    SKIP-IF-NOT-DEFINED PRINTER_HAS_4X6_MEDIA
    SKIP-IF-NOT-DEFINED PRINTER_HAS_NORMAL_QUALITY

    NAME "Print-Job with JPEG on 4x6, Normal Quality"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name "4x6 Color JPEG; Normal Quality"
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name color.jpg
    ATTR keyword compression none
    ATTR mimeMediaType document-format image/jpeg
    GROUP job-attributes-tag
    ATTR keyword media $PRINTER_HAS_4X6_MEDIA
    ATTR enum print-quality 4
    FILE color.jpg

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}

{
    SKIP-IF-DEFINED NOPRINT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_JPEG
    SKIP-IF-NOT-DEFINED PRINTER_HAS_4X6_MEDIA
    SKIP-IF-NOT-DEFINED PRINTER_HAS_HIGH_QUALITY

    NAME "Print-Job with JPEG on 4x6, High Quality"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name "4x6 Color JPEG; High Quality"
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name color.jpg
    ATTR keyword compression none
    ATTR mimeMediaType document-format image/jpeg
    GROUP job-attributes-tag
    ATTR keyword media $PRINTER_HAS_4X6_MEDIA
    ATTR enum print-quality 5
    FILE color.jpg

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}

{
    SKIP-IF-DEFINED NOPRINT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_PDF
    SKIP-IF-NOT-DEFINED PRINTER_HAS_A4_MEDIA
    SKIP-IF-NOT-DEFINED PRINTER_HAS_DRAFT_QUALITY

    NAME "Print-Job with A4 PDF, Draft Quality"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name "A4 Test Document; 2-Up"
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name document-a4.pdf
    ATTR keyword compression none
    ATTR mimeMediaType document-format application/pdf
    GROUP job-attributes-tag
    ATTR keyword media $PRINTER_HAS_A4_MEDIA
    ATTR enum print-quality 3
    FILE document-a4.pdf

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}

{
    SKIP-IF-DEFINED NOPRINT
    SKIP-IF-NOT-DEFINED PRINTER_HAS_PDF
    SKIP-IF-NOT-DEFINED PRINTER_HAS_LETTER_MEDIA
    SKIP-IF-NOT-DEFINED PRINTER_HAS_DRAFT_QUALITY

    NAME "Print-Job with US Letter PDF, Draft Quality"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name "US Letter Test Document; 2-Up"
    ATTR boolean ipp-attribute-fidelity false
    ATTR name document-name document-letter.pdf
    ATTR keyword compression none
    ATTR mimeMediaType document-format application/pdf
    GROUP job-attributes-tag
    ATTR keyword media $PRINTER_HAS_LETTER_MEDIA
    ATTR enum print-quality 3
    FILE document-letter.pdf

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}


# Test hold/release in the context of Print-Job w/job-hold-until + Release-Job
{
    SKIP-IF-NOT-DEFINED PRINTER_HAS_HOLD_JOB

    NAME "Print-Job with job-hold-until"
    OPERATION Print-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR name requesting-user-name $user
    ATTR name job-name "Test Document w/Hold"
    ATTR name document-name $filename
    ATTR keyword compression none
    ATTR mimeMediaType document-format $filetype
    GROUP job-attributes-tag
    ATTR keyword job-hold-until indefinite
    FILE $filename

    STATUS successful-ok
    STATUS server-error-job-canceled
    STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30

    EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_REGEX"
    EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE >0
    EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE 3,4,5,6,7,8,9
    EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
    EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
    EXPECT ?number-of-intervening-jobs OF-TYPE integer
	   IN-GROUP job-attributes-tag WITH-VALUE >-1
}

{
    SKIP-IF-NOT-DEFINED PRINTER_HAS_HOLD_JOB

    NAME "Release-Job"
    OPERATION Release-Job
    GROUP operation-attributes-tag
    ATTR charset attributes-charset utf-8
    ATTR naturalLanguage attributes-natural-language en
    ATTR uri printer-uri $uri
    ATTR integer job-id $job-id
    ATTR name requesting-user-name $user

    STATUS successful-ok
    STATUS client-error-not-possible
}
