(require 'lunit)
(require 'mime)

(luna-define-class test-rfc2231 (lunit-test-case))

;;;
;;; Parameter Value Continuations
;;;

;; The content-type field
;;
;;	Content-Type: message/external-body; access-type=URL;
;;	 URL*0="ftp://";
;;	 URL*1="cs.utk.edu/pub/moore/bulk-mailer/bulk-mailer.tar"
;;
;; is semantically identical to
;;
;;	Content-Type: message/external-body; access-type=URL;
;;	 URL="ftp://cs.utk.edu/pub/moore/bulk-mailer/bulk-mailer.tar"
;;
(luna-define-method test-rfc2231-continuation-1 ((case test-rfc2231))
  (lunit-assert
   (eq
    (mime-content-type-primary-type
     (mime-parse-Content-Type "message/external-body; access-type=URL;
 URL*0=\"ftp://\";
 URL*1=\"cs.utk.edu/pub/moore/bulk-mailer/bulk-mailer.tar\""))
    (mime-content-type-primary-type
     (mime-parse-Content-Type "message/external-body; access-type=URL;
 URL=\"ftp://cs.utk.edu/pub/moore/bulk-mailer/bulk-mailer.tar\"")))))

(luna-define-method test-rfc2231-continuation-2 ((case test-rfc2231))
  (lunit-assert
   (eq
    (mime-content-type-subtype
     (mime-parse-Content-Type "message/external-body; access-type=URL;
 URL*0=\"ftp://\";
 URL*1=\"cs.utk.edu/pub/moore/bulk-mailer/bulk-mailer.tar\""))
    (mime-content-type-subtype
     (mime-parse-Content-Type "message/external-body; access-type=URL;
 URL=\"ftp://cs.utk.edu/pub/moore/bulk-mailer/bulk-mailer.tar\"")))))

(luna-define-method test-rfc2231-continuation-3 ((case test-rfc2231))
  (lunit-assert
   (string=
    (mime-content-type-parameter
     (mime-parse-Content-Type "message/external-body; access-type=URL;
 URL*0=\"ftp://\";
 URL*1=\"cs.utk.edu/pub/moore/bulk-mailer/bulk-mailer.tar\"")
     "access-type")
    (mime-content-type-parameter
     (mime-parse-Content-Type "message/external-body; access-type=URL;
 URL=\"ftp://cs.utk.edu/pub/moore/bulk-mailer/bulk-mailer.tar\"")
     "access-type"))))

(luna-define-method test-rfc2231-continuation-4 ((case test-rfc2231))
  (lunit-assert
   (string=
    (mime-content-type-parameter
     (mime-parse-Content-Type "message/external-body; access-type=URL;
 URL*0=\"ftp://\";
 URL*1=\"cs.utk.edu/pub/moore/bulk-mailer/bulk-mailer.tar\"")
     "url")
    (mime-content-type-parameter
     (mime-parse-Content-Type "message/external-body; access-type=URL;
 URL=\"ftp://cs.utk.edu/pub/moore/bulk-mailer/bulk-mailer.tar\"")
     "url"))))

;;;
;;; Parameter Value Character Set and Language Information
;;;

;;	Content-Type: application/x-stuff;
;;	 title*=us-ascii'en-us'This%20is%20%2A%2A%2Afun%2A%2A%2A
(luna-define-method test-rfc2231-charset-language-1 ((case test-rfc2231))
  (lunit-assert
   (string=
    (mime-content-type-parameter
     (mime-parse-Content-Type "application/x-stuff;
 title*=us-ascii'en-us'This%20is%20%2A%2A%2Afun%2A%2A%2A")
     "title")
    "This is ***fun***")))

(luna-define-method test-rfc2231-charset-language-2 ((case test-rfc2231))
  (lunit-assert
   (string=
    (mime-content-type-parameter
     (mime-parse-Content-Type "application/x-stuff;
 title*=''This%20is%20%2A%2A%2Afun%2A%2A%2A")
     "title")
    "This is ***fun***")))

;;;
;;; Combining Character Set, Language, and Parameter Continuations
;;;

;;	Content-Type: application/x-stuff;
;;	 title*0*=us-ascii'en'This%20is%20even%20more%20;
;;	 title*1*=%2A%2A%2Afun%2A%2A%2A%20;
;;	 title*2="isn't it!"
(luna-define-method test-rfc2231-charset-language-continuation-1 ((case test-rfc2231))
  (lunit-assert
   (string=
    (mime-content-type-parameter
     (mime-parse-Content-Type "application/x-stuff;
 title*0*=us-ascii'en'This%20is%20even%20more%20;
 title*1*=%2A%2A%2Afun%2A%2A%2A%20;
 title*2=\"isn't it!\"")
     "title")
    "This is even more ***fun*** isn't it!")))

;; MIME states that parameters are not order sensitive.
(luna-define-method test-rfc2231-charset-language-continuation-2 ((case test-rfc2231))
  (lunit-assert
   (string=
    (mime-content-type-parameter
     (mime-parse-Content-Type "application/x-stuff;
 title*2=\"isn't it!\";
 title*1*=%2A%2A%2Afun%2A%2A%2A%20;
 title*0*=us-ascii'en'This%20is%20even%20more%20")
     "title")
    "This is even more ***fun*** isn't it!")))

;; ABNF states that `ext-octet' is case-insensitive.
(luna-define-method test-rfc2231-charset-language-continuation-3 ((case test-rfc2231))
  (lunit-assert
   (let ((case-fold-search nil))
     (string=
      (mime-content-type-parameter
       (mime-parse-Content-Type "application/x-stuff;
 title*=us-ascii'en-us'This%20is%20%2a%2a%2afun%2a%2a%2a")
       "title")
      "This is ***fun***"))))

;; unencoded segments MUST NOT be decoded.
(luna-define-method test-rfc2231-charset-language-continuation-4 ((case test-rfc2231))
  (lunit-assert
   (string=
    (mime-content-type-parameter
     (mime-parse-Content-Type "application/x-stuff;
 title*0*=us-ascii'en'This%20is%20even%20more%20;
 title*1*=%2A%2A%2Afun%2A%2A%2A%20;
 title*2=\"isn%27t%20it!\"")
     "title")
    "This is even more ***fun*** isn%27t%20it!")))

;;;
;;; Language specification in Encoded Words
;;;

(luna-define-method test-rfc2231-encoded-word-1 ((case test-rfc2231))
  (lunit-assert
   (string=
    (eword-decode-string "=?US-ASCII?Q?Keith_Moore?=")
    "Keith Moore")))

(luna-define-method test-rfc2231-encoded-word-2 ((case test-rfc2231))
  (lunit-assert
   (string=
    (eword-decode-string "=?US-ASCII*EN?Q?Keith_Moore?=")
    "Keith Moore")))

(luna-define-method test-rfc2231-encoded-word-3 ((case test-rfc2231))
  (lunit-assert
   (eq
    (get-text-property
     0 'mime-language
     (eword-decode-string "=?US-ASCII*EN?Q?Keith_Moore?="))
    'en)))

;;;
;;; Language specification in FLIM
;;;

;; both flim-1_13-rfc2231 and flim-1_14-rfc2231 choose to put language
;; info to the `mime-language' text-property of the parameter value.

(luna-define-method test-rfc2231-mime-language-1 ((case test-rfc2231))
  (lunit-assert
   (eq
    (get-text-property
     0 'mime-language
     (mime-content-type-parameter
      (mime-parse-Content-Type "application/x-stuff;
 title*=us-ascii'en-us'This%20is%20%2A%2A%2Afun%2A%2A%2A")
      "title"))
    'en-us)))

(luna-define-method test-rfc2231-mime-language-2 ((case test-rfc2231))
  (lunit-assert
   (eq
    (get-text-property
     0 'mime-language
     (mime-content-type-parameter
      (mime-parse-Content-Type "application/x-stuff;
 title*=US-ASCII'EN-US'This%20is%20%2A%2A%2Afun%2A%2A%2A")
      "title"))
    'en-us)))

(luna-define-method test-rfc2231-mime-language-3 ((case test-rfc2231))
  (lunit-assert
   (null
    (get-text-property
     0 'mime-language
     (mime-content-type-parameter
      (mime-parse-Content-Type "application/x-stuff;
 title*=us-ascii''This%20is%20%2A%2A%2Afun%2A%2A%2A")
      "title")))))

(luna-define-method test-rfc2231-mime-language-4 ((case test-rfc2231))
  (lunit-assert
   (null
    (get-text-property
     0 'mime-language
     (mime-content-type-parameter
      (mime-parse-Content-Type "application/x-stuff;
 title*=''This%20is%20%2A%2A%2Afun%2A%2A%2A")
      "title")))))
