From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp2 ([2001:41d0:8:6d80::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms0.migadu.com with LMTPS id WF/tIy7svmE/lQAAgWs5BA (envelope-from ) for ; Sun, 19 Dec 2021 09:24:14 +0100 Received: from aspmx1.migadu.com ([2001:41d0:8:6d80::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp2 with LMTPS id 8Py2Hy7svmEKBAAAB5/wlQ (envelope-from ) for ; Sun, 19 Dec 2021 08:24:14 +0000 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 1D1721B198 for ; Sun, 19 Dec 2021 09:24:14 +0100 (CET) Received: from localhost ([::1]:56100 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1myrUL-0005ND-AH for larch@yhetil.org; Sun, 19 Dec 2021 03:24:13 -0500 Received: from eggs.gnu.org ([209.51.188.92]:50860) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1myrTy-0005Mq-1d for emacs-orgmode@gnu.org; Sun, 19 Dec 2021 03:23:50 -0500 Received: from ciao.gmane.io ([116.202.254.214]:60072) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1myrTv-0003pt-OF for emacs-orgmode@gnu.org; Sun, 19 Dec 2021 03:23:49 -0500 Received: from list by ciao.gmane.io with local (Exim 4.92) (envelope-from ) id 1myrTs-0000x7-8b for emacs-orgmode@gnu.org; Sun, 19 Dec 2021 09:23:44 +0100 X-Injected-Via-Gmane: http://gmane.org/ To: emacs-orgmode@gnu.org From: Max Nikulin Subject: Re: [PATCH] org-test: Create a collaborative test set for Org buffer parser Date: Sun, 19 Dec 2021 15:23:32 +0700 Message-ID: References: <87fsqzi4tw.fsf@localhost> <871r2et31t.fsf@localhost> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------7322CCC8B422FC057AED982B" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.14.0 In-Reply-To: <871r2et31t.fsf@localhost> Content-Language: en-US Received-SPF: pass client-ip=116.202.254.214; envelope-from=geo-emacs-orgmode@m.gmane-mx.org; helo=ciao.gmane.io X-Spam_score_int: 22 X-Spam_score: 2.2 X-Spam_bar: ++ X-Spam_report: (2.2 / 5.0 requ) BAYES_00=-1.9, DKIM_ADSP_CUSTOM_MED=0.001, FORGED_GMAIL_RCVD=1, FORGED_MUA_MOZILLA=2.309, FREEMAIL_FORGED_FROMDOMAIN=0.249, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.25, NICE_REPLY_A=-0.563, NML_ADSP_CUSTOM_MED=0.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-orgmode@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+larch=yhetil.org@gnu.org Sender: "Emacs-orgmode" X-Migadu-Flow: FLOW_IN X-Migadu-Country: US ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1639902254; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type:in-reply-to:in-reply-to: references:references:list-id:list-help:list-unsubscribe: list-subscribe:list-post; bh=RT0vSZ9UfTNadfZQQvlXn1doYmYczobWZu7FYumDeTQ=; b=QHiIRA3BGWIZwvDsZmLRCrduAE7uwbl4NmlHWwIcNX6cKDCFfi61h6K1tzk7jYiEKEDSZl FjSZaKZfUJj03L9Lizw4BO8F75/Y92RJxiNgfioUlX+hVOQhuLNbcyOIpqRlbL+Z5AfQ3Q mKG+5KrJ3mf2JPp/zLlkrurcKYN/GHIfoluhbWX21RF/lQ4JnVzPxuNUvHNOW+4Qq8eLQv BH06OskjxiOUlywaUVA/1t9eIjpWvYzByfpC6z9zQxvFa7V2/L0yCmzbl90Iy1qlnb+Q4H 0da2h+Uyorb53sQR52zQI6k7EJQ9OPZ3vWYauY7ublN0RUCvUCIr90L7bxnl+g== ARC-Seal: i=1; s=key1; d=yhetil.org; t=1639902254; a=rsa-sha256; cv=none; b=elsQrJM9bwm7kf1SLP8EhQRbLVOZdscmwXwlJNZhwvRyOqBBqkpBdHfsMk1iB9OCLsF+2c V3biOZ5Pa8vipmqtEh51CZ+nH9+aAxpfaP/o0vM6Y6zcDZ+WlRvcXIdMmagUAcyRgogIMp Us3KM9Gcp3eUpTvGRB1HiKsflO/H4O5xhckN6zYbVOfv+aXygVe1FUrxzZUlxzLX51tHNl 4sWIg+kueS8DHBP8W3MMaNsObHnkjmq3mtKv2/tvgtm52Lncr4HA6jBw6+JfaibY3G1iLJ bM6a8/ydknCCxe+4y21IYv8tOMbMPEw8w5eViHNnv66RgzRplBS2iROzG4ABNA== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=none; dmarc=fail reason="SPF not aligned (relaxed), No valid DKIM" header.from=gmail.com (policy=none); spf=pass (aspmx1.migadu.com: domain of "emacs-orgmode-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="emacs-orgmode-bounces+larch=yhetil.org@gnu.org" X-Migadu-Spam-Score: -2.31 Authentication-Results: aspmx1.migadu.com; dkim=none; dmarc=fail reason="SPF not aligned (relaxed), No valid DKIM" header.from=gmail.com (policy=none); spf=pass (aspmx1.migadu.com: domain of "emacs-orgmode-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="emacs-orgmode-bounces+larch=yhetil.org@gnu.org" X-Migadu-Queue-Id: 1D1721B198 X-Spam-Score: -2.31 X-Migadu-Scanner: scn0.migadu.com X-TUID: YBgfeUi5qDPf This is a multi-part message in MIME format. --------------7322CCC8B422FC057AED982B Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Sorry for delay. I expected that a next step with inline raw AST fragments would be easier, but I have got working example for parser tests grouped in single file earlier. Certainly org files may be source for parser tests. They are readable enough to be convenient for developers and, I hope, it would not require a lot of work to convert them in machine-readable files. However tests should be distributed in some format(s) with widely available parsers: s-expressions, YAML, JSON. I am against JSON for source files since working with multiline text will likely be a pain (besides editing of files, patches and VCS diffs should be taken into account). Actually there is a requirement for external projects related to parser already. Expected results are provided as S-expressions. For simplicity I described a test suite with a couple of cases using s-expressions (see attachments). Names of macro an functions are arbitrary. Interface should be like (demo-parse-test-suite "demo-test-suite.el") Current implementation creates an ert test for each entry in such file, but it may be changed later. I just had example of macro for parametrized test from earlier experiments. On 15/12/2021 20:23, Ihor Radchenko wrote: > Max Nikulin writes: >> On 11/12/2021 21:39, Ihor Radchenko wrote: >>> >>> The attached patch is an attempt to create something like shared repo >>> for Org element parser tests. >> >> "[PATCH]" prefix in the subject might be a reason why you message >> received less attention than it should. At least Tom and Timothy have their parsers, so I expected some response from them. I am unsure whether posts about Organice were from developers or from users. Patch is something too internal to development of namely Org Mode as Emacs major mode. Once I asked to avoid proposal to integrate everything meaning mostly particular person who was extremely active that time, but it had effect on more people than I thought. You intention may have stronger result than it should as well. > I am not sure here. In a way, we already have such a format in > test-org-element.el: > > (ert-deftest test-org-element/bold-parser () > "Test `bold' parser." > ;; Standard test. > (should > (org-test-with-temp-text "*bold*" > (org-element-map (org-element-parse-buffer) 'bold #'identity nil t)))) It is a bit harder to parse than it is acceptable for external tools. However it may be converted to more convenient format using elisp facilities. > So, in addition to writing the Org parser, third-party dev > will also have to write a parser for the test format. I assume available parser for some wide spread format and some simple interpretation of the structures specific to these tests. > Most existing parser libraries can > handle individual files, but not individual pieces of text grouped into > bigger file using yet another standard convention. It should take a several line of code to put string input into a temporary file. Likely it is possible to implement interface of file stream for input string. Finally, it may stimulate developers to add a method that parses strings. I found the following test corpus impressive and unmanageable in the form of separate files: https://github.com/tgbugs/laundry/blob/master/laundry/test.rkt > But is there a > standard multi-test in one file format that can be used in multiple > programming languages? Some testing frameworks have facilities for parametrized tests with lists of arbitrary structures, others explicitly recommends to write a loop over such lists. > Or even allow inline tests via buffer-local after-save-hook: > > - text :: "*Bold* emphasis" > - keywords :: emphasis, heading > - description :: Despite line is started from a star, there is no > space after it, so it is not a heading. > > Upon save, the text:: field will be automatically converted to a > test-hash.org+test-hash.el files. Or to a single file with some top-level metadata and a list (maybe nested lists) of tests. Unsure that such files should be stored in git. >> Version of Org and test set should be included into metadata for the >> whole suite. > > If the test set is distributed together with Org, I see no reason to do > it. Otherwise, the test set should simply track bugfix and main branches > of Org and follow Org releases. Does it sound reasonable? I have no particular opinion if test sources should be maintained in the same repository with Org or Emacs. If test are described in Org files then test suites should be distributed using some other way. >> Since partial compliance is assumed, format of test results should be >> declared as well to be able to publish overview or comparison. > > I provided a short description of the format in the README (see the > original patch). Is it not enough? I mean result of *group* of tests to present comparison of parsers. Unsure if JUnit XML files are appropriate. >> Are properties like :begin and :end mandatory for reference results of >> parsing? They make structures more verbose and harder to read. Often it >> is enough to compare content and similar properties. > > I afraid that if we put contents of every headline/element in place of > :begin :end, the results will be even less readable. The results will > have to dump multiple cumulative instances of the original file. I had in mind that only leaf elements have contents. It may result in some ambiguity however. > Actually, there have been talks about including Org mode tests into > Emacs itself (https://yhetil.org/emacs-devel/87o8629h8g.fsf_-_@gmx.de/) I have seen proposals to drop separate repository for Org and do everything inside the one for Emacs earlier. In my opinion, it would mean broken compatibility with earlier version of Emacs, so I do not like it. On the other hand I am not an active developer, so my arguments may be ignored. P.S. Output or Ert requires more tuning: ---- >8 ---- Selector: t Passed: 1 Failed: 1 (1 unexpected) Skipped: 0 Total: 2/2 Started at: 2021-12-19 14:13:54+0700 Finished. Finished at: 2021-12-19 14:13:54+0700 F. F demo-parse-test/demo-test-suite--bold-emphasis-at-beginning-of-line Bold text marker at beginning of line should not be confused with heading: no space after star (‘demo-parse-test/demo-test-suite’) (ert-test-failed ((should (funcall # '(org-data ... ...) (apply #'demo-test-parse-input '...))) :form (funcall # (org-data (:begin 1 :contents-begin 1 :contents-end 13 :end 13 :post-affiliated 1 ...) (paragraph (:begin 1 :contents-begin 1 :contents-end 13 :end 13 :post-affiliated 1 ...) (bold ... "Bold text"))) (org-data (:begin 1 :contents-begin 1 :contents-end 13 :end 13 :post-affiliated 1 ...) (section (:begin 1 :contents-begin 1 :contents-end 13 :end 13 :post-affiliated 1 ...) (paragraph ... ... " ")))) :value nil)) --------------7322CCC8B422FC057AED982B Content-Type: text/x-emacs-lisp; charset=UTF-8; name="demo-test-suite.el" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="demo-test-suite.el" ( :description "Just a demo of test suite for org-element parser" :cases ( (:id simple-heading :description "Heading and section with paragraph" :input " * this is a heading With some text below. " :result (org-data (:begin 1 :contents-begin 3 :contents-end 46 :end 46 :post-affiliated 1 :post-blank 0) (headline (:archivedp nil :begin 3 :commentedp nil :contents-begin 24 :contents-end 46 :end 46 :footnote-section-p nil :level 1 :post-affiliated 3 :post-blank 0 :pre-blank 1 :priority nil :raw-value "this is a heading" :tags nil :title ("this is a heading") :todo-keyword nil :todo-type nil) (section (:begin 24 :contents-begin 24 :contents-end 46 :end 46 :post-affiliated 24 :post-blank 0) (paragraph (:begin 24 :contents-begin 24 :contents-end 46 :end 46 :post-affiliated 24 :post-blank 0) "With some text below.\n"))))) (:id bold-emphasis-at-beginning-of-line :description "Bold text marker at beginning of line should not be confused with heading: no space after star" :input "*Bold text* " :result (org-data (:begin 1 :contents-begin 1 :contents-end 13 :end 13 :post-affiliated 1 :post-blank 0) (paragraph (:begin 1 :contents-begin 1 :contents-end 13 :end 13 :post-affiliated 1 :post-blank 0) (bold (:begin 1 :contents-begin 2 :contents-end 11 :end 13) "Bold text")))) )) --------------7322CCC8B422FC057AED982B Content-Type: text/x-emacs-lisp; charset=UTF-8; name="demo-test.el" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="demo-test.el" ;;;; Example of usage: ;;;; (demo-parse-test-suite "demo-test-suite.el") (defmacro nm-deftest-parametrized (prefix-sym func-predicate &rest doc-cases) "Define parametrized test For each SUFFIX, CASE-DOCSTRING, EXPECTATION, ARGS list call `ert-deftest' with SUITE--SUFFIX name, CASE-DOCSTRING, and `should' that checks whether EXPECTATION is consistent with result of FUNCTION applied to ARGS using PREDICATE or `equal'. \(fn SUITE (FUNCTION [PREDICATE]) \ [SUITE-DOCSTRING] \ (SUFFIX CASE-DOCSTRING EXPECTATION ARGS...)...)" (declare (debug (&define [&name "test@" symbolp] sexp [&optional strinp] def-body)) (indent 2) (doc-string 3)) (let* ((func (car func-predicate)) (predicate (or (cadr func-predicate) (symbol-function 'equal))) (prefix (symbol-name prefix-sym)) (maybe-doc (car doc-cases)) (cases (if (stringp maybe-doc) (cdr doc-cases) doc-cases)) (case-list (mapcar (lambda (case) (format "- `%s--%s'" prefix (symbol-name (car case)))) cases)) ;; Unfortunately `ert-describe-test' works only in ert mode ;; and links to particular subtests are inactive. (suite-doc (if (stringp maybe-doc) (cons maybe-doc case-list) case-list))) (append `(,#'progn ;; A function to assing doc string that is linked from each test. (defun ,prefix-sym () ,(mapconcat #'identity suite-doc "\n"))) (mapcar (lambda (case) ;; Have not managed to express "&rest" using `pcase-let'. (apply (lambda (id-sym case-docstring expectation &rest args) (let* ((id (symbol-name id-sym)) (name (intern (concat prefix "--" id))) (docstring (format "%s (`%s')" case-docstring prefix))) `(ert-deftest ,name () ,docstring (should (funcall ,predicate ,expectation (apply ,func (quote ,args))))))) case)) cases)))) (defun demo-test-parse-input (text) (with-temp-buffer (insert text) (org-mode) (test-org-element-parser-generate-syntax-sexp))) (defmacro demo-parse-test-suite (file-name) (let* ((prefix (file-name-base file-name)) (prefix-sym (intern (concat "demo-parse-test/" prefix))) (suite (with-temp-buffer (insert-file-contents file-name) (read (current-buffer)))) (case-list (plist-get suite :cases)) (suite-description (plist-get suite :description))) `(nm-deftest-parametrized ,prefix-sym (#'demo-test-parse-input) ,suite-description ,@(mapcar (lambda (case) (list (plist-get case :id) (or (plist-get case :description) "Warning: no description for this case") `(quote ,(plist-get case :result)) (plist-get case :input))) case-list)))) --------------7322CCC8B422FC057AED982B Content-Type: application/json; name="demo-test-suite.json" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="demo-test-suite.json" ewogICJkZXNjcmlwdGlvbiI6ICJKdXN0IGEgZGVtbyBvZiB0ZXN0IHN1aXRlIGZvciBvcmct ZWxlbWVudCBwYXJzZXIiLAogICJjYXNlcyI6IFsKICAgIHsKICAgICAgImlkIjogInNpbXBs ZS1oZWFkaW5nIiwKICAgICAgImRlc2NyaXB0aW9uIjogIkhlYWRpbmcgYW5kIHNlY3Rpb24g d2l0aCBwYXJhZ3JhcGgiLAogICAgICAiaW5wdXQiOiAiXG5cbiogdGhpcyBpcyBhIGhlYWRp bmdcblxuV2l0aCBzb21lIHRleHQgYmVsb3cuXG4iLAogICAgICAicmVzdWx0IjogWwogICAg ICAgICJvcmctZGF0YSIsCiAgICAgICAgewogICAgICAgICAgImJlZ2luIjogMSwKICAgICAg ICAgICJjb250ZW50cy1iZWdpbiI6IDMsCiAgICAgICAgICAiY29udGVudHMtZW5kIjogNDYs CiAgICAgICAgICAiZW5kIjogNDYsCiAgICAgICAgICAicG9zdC1hZmZpbGlhdGVkIjogMSwK ICAgICAgICAgICJwb3N0LWJsYW5rIjogMAogICAgICAgIH0sCiAgICAgICAgWwogICAgICAg ICAgImhlYWRsaW5lIiwKICAgICAgICAgIHsKICAgICAgICAgICAgImFyY2hpdmVkcCI6IG51 bGwsCiAgICAgICAgICAgICJiZWdpbiI6IDMsCiAgICAgICAgICAgICJjb21tZW50ZWRwIjog bnVsbCwKICAgICAgICAgICAgImNvbnRlbnRzLWJlZ2luIjogMjQsCiAgICAgICAgICAgICJj b250ZW50cy1lbmQiOiA0NiwKICAgICAgICAgICAgImVuZCI6IDQ2LAogICAgICAgICAgICAi Zm9vdG5vdGUtc2VjdGlvbi1wIjogbnVsbCwKICAgICAgICAgICAgImxldmVsIjogMSwKICAg ICAgICAgICAgInBvc3QtYWZmaWxpYXRlZCI6IDMsCiAgICAgICAgICAgICJwb3N0LWJsYW5r IjogMCwKICAgICAgICAgICAgInByZS1ibGFuayI6IDEsCiAgICAgICAgICAgICJwcmlvcml0 eSI6IG51bGwsCiAgICAgICAgICAgICJyYXctdmFsdWUiOiAidGhpcyBpcyBhIGhlYWRpbmci LAogICAgICAgICAgICAidGFncyI6IG51bGwsCiAgICAgICAgICAgICJ0aXRsZSI6IFsKICAg ICAgICAgICAgICAidGhpcyBpcyBhIGhlYWRpbmciCiAgICAgICAgICAgIF0sCiAgICAgICAg ICAgICJ0b2RvLWtleXdvcmQiOiBudWxsLAogICAgICAgICAgICAidG9kby10eXBlIjogbnVs bAogICAgICAgICAgfSwKICAgICAgICAgIFsKICAgICAgICAgICAgInNlY3Rpb24iLAogICAg ICAgICAgICB7CiAgICAgICAgICAgICAgImJlZ2luIjogMjQsCiAgICAgICAgICAgICAgImNv bnRlbnRzLWJlZ2luIjogMjQsCiAgICAgICAgICAgICAgImNvbnRlbnRzLWVuZCI6IDQ2LAog ICAgICAgICAgICAgICJlbmQiOiA0NiwKICAgICAgICAgICAgICAicG9zdC1hZmZpbGlhdGVk IjogMjQsCiAgICAgICAgICAgICAgInBvc3QtYmxhbmsiOiAwCiAgICAgICAgICAgIH0sCiAg ICAgICAgICAgIFsKICAgICAgICAgICAgICAicGFyYWdyYXBoIiwKICAgICAgICAgICAgICB7 CiAgICAgICAgICAgICAgICAiYmVnaW4iOiAyNCwKICAgICAgICAgICAgICAgICJjb250ZW50 cy1iZWdpbiI6IDI0LAogICAgICAgICAgICAgICAgImNvbnRlbnRzLWVuZCI6IDQ2LAogICAg ICAgICAgICAgICAgImVuZCI6IDQ2LAogICAgICAgICAgICAgICAgInBvc3QtYWZmaWxpYXRl ZCI6IDI0LAogICAgICAgICAgICAgICAgInBvc3QtYmxhbmsiOiAwCiAgICAgICAgICAgICAg fSwKICAgICAgICAgICAgICAiV2l0aCBzb21lIHRleHQgYmVsb3cuXG4iCiAgICAgICAgICAg IF0KICAgICAgICAgIF0KICAgICAgICBdCiAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICJp ZCI6ICJib2xkLWVtcGhhc2lzLWF0LWJlZ2lubmluZy1vZi1saW5lIiwKICAgICAgImRlc2Ny aXB0aW9uIjogIkJvbGQgdGV4dCBtYXJrZXIgYXQgYmVnaW5uaW5nIG9mIGxpbmUgc2hvdWxk IG5vdCBiZSBjb25mdXNlZCB3aXRoIGhlYWRpbmc6IG5vIHNwYWNlIGFmdGVyIHN0YXIiLAog ICAgICAiaW5wdXQiOiAiKkJvbGQgdGV4dCpcbiIsCiAgICAgICJyZXN1bHQiOiBbCiAgICAg ICAgIm9yZy1kYXRhIiwKICAgICAgICB7CiAgICAgICAgICAiYmVnaW4iOiAxLAogICAgICAg ICAgImNvbnRlbnRzLWJlZ2luIjogMSwKICAgICAgICAgICJjb250ZW50cy1lbmQiOiAxMywK ICAgICAgICAgICJlbmQiOiAxMywKICAgICAgICAgICJwb3N0LWFmZmlsaWF0ZWQiOiAxLAog ICAgICAgICAgInBvc3QtYmxhbmsiOiAwCiAgICAgICAgfSwKICAgICAgICBbCiAgICAgICAg ICAicGFyYWdyYXBoIiwKICAgICAgICAgIHsKICAgICAgICAgICAgImJlZ2luIjogMSwKICAg ICAgICAgICAgImNvbnRlbnRzLWJlZ2luIjogMSwKICAgICAgICAgICAgImNvbnRlbnRzLWVu ZCI6IDEzLAogICAgICAgICAgICAiZW5kIjogMTMsCiAgICAgICAgICAgICJwb3N0LWFmZmls aWF0ZWQiOiAxLAogICAgICAgICAgICAicG9zdC1ibGFuayI6IDAKICAgICAgICAgIH0sCiAg ICAgICAgICBbCiAgICAgICAgICAgICJib2xkIiwKICAgICAgICAgICAgewogICAgICAgICAg ICAgICJiZWdpbiI6IDEsCiAgICAgICAgICAgICAgImNvbnRlbnRzLWJlZ2luIjogMiwKICAg ICAgICAgICAgICAiY29udGVudHMtZW5kIjogMTEsCiAgICAgICAgICAgICAgImVuZCI6IDEz CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJCb2xkIHRleHQiCiAgICAgICAgICBdCiAg ICAgICAgXQogICAgICBdCiAgICB9CiAgXQp9Cg== --------------7322CCC8B422FC057AED982B Content-Type: application/x-yaml; name="demo-test-suite.yaml" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="demo-test-suite.yaml" ZGVzY3JpcHRpb246IEp1c3QgYSBkZW1vIG9mIHRlc3Qgc3VpdGUgZm9yIG9yZy1lbGVtZW50 IHBhcnNlcgpjYXNlczoKLSBpZDogc2ltcGxlLWhlYWRpbmcKICBkZXNjcmlwdGlvbjogSGVh ZGluZyBhbmQgc2VjdGlvbiB3aXRoIHBhcmFncmFwaAogIGlucHV0OiB8MgoKCiAgICAqIHRo aXMgaXMgYSBoZWFkaW5nCgogICAgV2l0aCBzb21lIHRleHQgYmVsb3cuCiAgcmVzdWx0Ogog IC0gb3JnLWRhdGEKICAtIGJlZ2luOiAxCiAgICBjb250ZW50cy1iZWdpbjogMwogICAgY29u dGVudHMtZW5kOiA0NgogICAgZW5kOiA0NgogICAgcG9zdC1hZmZpbGlhdGVkOiAxCiAgICBw b3N0LWJsYW5rOiAwCiAgLSAtIGhlYWRsaW5lCiAgICAtIGFyY2hpdmVkcDogbnVsbAogICAg ICBiZWdpbjogMwogICAgICBjb21tZW50ZWRwOiBudWxsCiAgICAgIGNvbnRlbnRzLWJlZ2lu OiAyNAogICAgICBjb250ZW50cy1lbmQ6IDQ2CiAgICAgIGVuZDogNDYKICAgICAgZm9vdG5v dGUtc2VjdGlvbi1wOiBudWxsCiAgICAgIGxldmVsOiAxCiAgICAgIHBvc3QtYWZmaWxpYXRl ZDogMwogICAgICBwb3N0LWJsYW5rOiAwCiAgICAgIHByZS1ibGFuazogMQogICAgICBwcmlv cml0eTogbnVsbAogICAgICByYXctdmFsdWU6IHRoaXMgaXMgYSBoZWFkaW5nCiAgICAgIHRh Z3M6IG51bGwKICAgICAgdGl0bGU6CiAgICAgIC0gdGhpcyBpcyBhIGhlYWRpbmcKICAgICAg dG9kby1rZXl3b3JkOiBudWxsCiAgICAgIHRvZG8tdHlwZTogbnVsbAogICAgLSAtIHNlY3Rp b24KICAgICAgLSBiZWdpbjogMjQKICAgICAgICBjb250ZW50cy1iZWdpbjogMjQKICAgICAg ICBjb250ZW50cy1lbmQ6IDQ2CiAgICAgICAgZW5kOiA0NgogICAgICAgIHBvc3QtYWZmaWxp YXRlZDogMjQKICAgICAgICBwb3N0LWJsYW5rOiAwCiAgICAgIC0gLSBwYXJhZ3JhcGgKICAg ICAgICAtIGJlZ2luOiAyNAogICAgICAgICAgY29udGVudHMtYmVnaW46IDI0CiAgICAgICAg ICBjb250ZW50cy1lbmQ6IDQ2CiAgICAgICAgICBlbmQ6IDQ2CiAgICAgICAgICBwb3N0LWFm ZmlsaWF0ZWQ6IDI0CiAgICAgICAgICBwb3N0LWJsYW5rOiAwCiAgICAgICAgLSB8CiAgICAg ICAgICBXaXRoIHNvbWUgdGV4dCBiZWxvdy4KLSBpZDogYm9sZC1lbXBoYXNpcy1hdC1iZWdp bm5pbmctb2YtbGluZQogIGRlc2NyaXB0aW9uOiAnQm9sZCB0ZXh0IG1hcmtlciBhdCBiZWdp bm5pbmcgb2YgbGluZSBzaG91bGQgbm90IGJlIGNvbmZ1c2VkIHdpdGgKICAgIGhlYWRpbmc6 IG5vIHNwYWNlIGFmdGVyIHN0YXInCiAgaW5wdXQ6IHwKICAgICpCb2xkIHRleHQqCiAgcmVz dWx0OgogIC0gb3JnLWRhdGEKICAtIGJlZ2luOiAxCiAgICBjb250ZW50cy1iZWdpbjogMQog ICAgY29udGVudHMtZW5kOiAxMwogICAgZW5kOiAxMwogICAgcG9zdC1hZmZpbGlhdGVkOiAx CiAgICBwb3N0LWJsYW5rOiAwCiAgLSAtIHBhcmFncmFwaAogICAgLSBiZWdpbjogMQogICAg ICBjb250ZW50cy1iZWdpbjogMQogICAgICBjb250ZW50cy1lbmQ6IDEzCiAgICAgIGVuZDog MTMKICAgICAgcG9zdC1hZmZpbGlhdGVkOiAxCiAgICAgIHBvc3QtYmxhbms6IDAKICAgIC0g LSBib2xkCiAgICAgIC0gYmVnaW46IDEKICAgICAgICBjb250ZW50cy1iZWdpbjogMgogICAg ICAgIGNvbnRlbnRzLWVuZDogMTEKICAgICAgICBlbmQ6IDEzCiAgICAgIC0gQm9sZCB0ZXh0 Cg== --------------7322CCC8B422FC057AED982B--