;;; Excercise RSS 2.0 reader. -*- Scheme -*-
;;;
;;; Copyright (C) 2008, 2009, 2012, 2020, 2021 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of Skribilo.
;;;
;;; Skribilo is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU Lesser General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or (at
;;; your option) any later version.
;;;
;;; Skribilo is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
;;; General Public License for more details.
;;;
;;; You should have received a copy of the GNU Lesser General Public License
;;; along with this program. If not, see <http://www.gnu.org/licenses/>.
(define-module (tests rss-2)
#:use-module (ice-9 match)
#:use-module (skribilo reader)
#:use-module (srfi srfi-64))
(if (or (not (false-if-exception (resolve-interface '(sxml simple))))
(not (false-if-exception (resolve-interface '(htmlprag)))))
(exit 77))
(define %rss2-read #f)
(define-syntax test-match
(syntax-rules ()
((_ name pattern xml)
;; Test whether the RSS feed in XML matches PATTERN.
(test-assert name
(match (%rss2-read (open-input-string xml))
(pattern #t)
(_ #f))))))
(test-begin "rss-2")
(test-eq "make-reader" #t
(begin
(set! %rss2-read (make-reader 'rss-2))
(procedure? %rss2-read)))
(test-match "basic"
`(document ,'#:title (list "The Channel")
(chapter ,'#:title (list "Foo Bar")
,_ ;; the date
(list "Hello world.")))
"<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>
<rss version=\"2.0\">
<channel>
<title>The Channel</title>
<link>http://example.net/</link>
<description>Some channel description...</description>
<item>
<title>Foo Bar</title>
<pubDate>Mon, 06 Jun 2005 23:05:00 +0200</pubDate>
<description>Hello world.</description>
</item>
</channel>
</rss>")
(test-match "with HTML markup"
`(document ,'#:title (list (emph "The") " Channel")
(chapter ,'#:title (list "Foo " (bold "&") " Bar")
,_ ;; the date
(list (p "Hello world."))))
"<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>
<rss version=\"2.0\">
<channel>
<title><em>The</em> Channel</title>
<link>http://example.net/</link>
<description>Some channel description...</description>
<item>
<title>Foo <b>&</b> Bar</title>
<pubDate>Mon, 06 Jun 2005 23:05:00 +0200</pubDate>
<description><P>Hello world.</P></description>
</item>
</channel>
</rss>")
(test-match "broken date format"
`(document ,'#:title (list "The Channel")
(chapter ,'#:title (list "Foo Bar")
,_ ;; the date
(list "Hello world.")))
"<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>
<rss version=\"2.0\">
<channel>
<title>The Channel</title>
<link>http://example.net/</link>
<description>Some channel description...</description>
<item>
<title>Foo Bar</title>
<!-- Feeds at livejournal.com, e.g.,
http://udrepper.livejournal.com/rss.xml contain a broken date with,
e.g., \"GMT\" instead of \"+0000\". -->
<pubDate>Mon, 06 Jun 2005 23:05:00 GMT</pubDate>
<description>Hello world.</description>
</item>
</channel>
</rss>")
(test-match "table"
`(document ,'#:title (list "The Channel")
(chapter ,'#:title (list "Foo Bar")
,_ ;; the date
(list
,_ ,_ ;; whitespace
(table
(th (td "Foo") (td "Bar"))
(tr (td "001") (td "002")))
,_ ,_ ;; whitespace
)))
"<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>
<rss version=\"2.0\">
<channel>
<title>The Channel</title>
<link>http://example.net/</link>
<description>Some channel description...</description>
<item>
<title>Foo Bar</title>
<pubDate>Mon, 06 Jun 2005 23:05:00 +0200</pubDate>
<description>
<table>
<th><td>Foo</td><td>Bar</td></th>
<tr><td>001</td><td>002</td></tr>
</table>
</description>
</item>
</channel>
</rss>")
(test-end "rss-2")