From b2e8f5d1e17dd69cd348b26a9de5817fb52fab1c Mon Sep 17 00:00:00 2001
From: Valentin Lorentz <progval+git@progval.net>
Date: Sat, 8 Apr 2023 17:37:12 +0200
Subject: [PATCH] list: Add test for two channels and/or two params

---
 irctest/server_tests/list.py | 106 +++++++++++++++++++++++++++++++++++
 irctest/specifications.py    |   1 +
 pytest.ini                   |   1 +
 3 files changed, 108 insertions(+)

diff --git a/irctest/server_tests/list.py b/irctest/server_tests/list.py
index 2063acb..6b8f682 100644
--- a/irctest/server_tests/list.py
+++ b/irctest/server_tests/list.py
@@ -238,6 +238,112 @@ class ListTestCase(_BasedListTestCase):
         self.sendLine(3, "LIST <100")
         self.assertEqual(self._parseChanList(3), {"#chan1", "#chan2"})
 
+    @cases.mark_specifications("Modern")
+    def testListTwoChannels(self):
+        """
+        "Parameters: [<channel>{,<channel>}] [<elistcond>{,<elistcond>}]"
+        -- https://modern.ircdocs.horse/#list-message
+        """
+        self.connectClient("foo")
+
+        if "U" not in self.server_support.get("ELIST", ""):
+            raise runner.OptionalExtensionNotSupported("ELIST=U")
+
+        if "TARGMAX" in self.server_support:
+            for item in (self.server_support["TARGMAX"]).split(","):
+                (command, max_) = item.split(":", 1)
+                if command == "LIST" and int(max_ or "1000") < 2:
+                    raise runner.OptionalExtensionNotSupported("TARGMAX=LIST >= 2")
+
+        self.sendLine(1, "JOIN #chan1")
+        self.getMessages(1)
+        self.sendLine(1, "JOIN #chan2")
+        self.getMessages(1)
+        self.sendLine(1, "JOIN #chan3")
+        self.getMessages(1)
+
+        self.connectClient("bar")
+        self.sendLine(2, "JOIN #chan2")
+        self.getMessages(2)
+
+        self.connectClient("baz")
+
+        self.sendLine(3, "LIST")
+        self.assertEqual(self._parseChanList(3), {"#chan1", "#chan2", "#chan3"})
+
+        self.sendLine(3, "LIST #chan1,#chan2")
+        self.assertEqual(self._parseChanList(3), {"#chan1", "#chan2"})
+
+    @cases.mark_isupport("ELIST")
+    @cases.mark_specifications("Modern")
+    def testListTwoParams(self):
+        """
+        "Parameters: [<channel>{,<channel>}] [<elistcond>{,<elistcond>}]"
+        -- https://modern.ircdocs.horse/#list-message
+        """
+        self.connectClient("foo")
+
+        if "U" not in self.server_support.get("ELIST", ""):
+            raise runner.OptionalExtensionNotSupported("ELIST=U")
+
+        self.sendLine(1, "JOIN #chan1")
+        self.getMessages(1)
+        self.sendLine(1, "JOIN #chan2")
+        self.getMessages(1)
+
+        self.connectClient("bar")
+        self.sendLine(2, "JOIN #chan2")
+        self.getMessages(2)
+
+        self.connectClient("baz")
+
+        self.sendLine(3, "LIST #chan1 >0")
+        self.assertEqual(self._parseChanList(3), {"#chan1"})
+
+        self.sendLine(3, "LIST #chan1 <1")
+        self.assertEqual(self._parseChanList(3), set())
+
+        self.sendLine(3, "LIST #chan1,#chan2 >0")
+        self.assertEqual(self._parseChanList(3), {"#chan1", "#chan2"})
+
+        self.sendLine(3, "LIST #chan1,#chan2 <1")
+        self.assertEqual(self._parseChanList(3), set())
+
+    @cases.mark_isupport("ELIST")
+    @cases.mark_specifications("Modern")
+    def testListTwoParamsTwoChannels(self):
+        """
+        "Parameters: [<channel>{,<channel>}] [<elistcond>{,<elistcond>}]"
+        -- https://modern.ircdocs.horse/#list-message
+        """
+        self.connectClient("foo")
+
+        if "U" not in self.server_support.get("ELIST", ""):
+            raise runner.OptionalExtensionNotSupported("ELIST=U")
+
+        if "TARGMAX" in self.server_support:
+            for item in (self.server_support["TARGMAX"]).split(","):
+                (command, max_) = item.split(":", 1)
+                if command == "LIST" and int(max_ or "1000") < 2:
+                    raise runner.OptionalExtensionNotSupported("TARGMAX=LIST >= 2")
+
+        self.sendLine(1, "JOIN #chan1")
+        self.getMessages(1)
+        self.sendLine(1, "JOIN #chan2")
+        self.getMessages(1)
+
+        self.connectClient("bar")
+        self.sendLine(2, "JOIN #chan2")
+        self.getMessages(2)
+
+        self.connectClient("baz")
+
+        self.sendLine(3, "LIST #chan1,#chan2 >0")
+        self.assertEqual(self._parseChanList(3), {"#chan1", "#chan2"})
+
+        self.sendLine(3, "LIST #chan1,#chan2 <1")
+        self.assertEqual(self._parseChanList(3), set())
+
 
 class FaketimeListTestCase(_BasedListTestCase):
     faketime = "+1y x30"  # for every wall clock second, 1 minute passed for the server
diff --git a/irctest/specifications.py b/irctest/specifications.py
index 9c4617b..cb68a36 100644
--- a/irctest/specifications.py
+++ b/irctest/specifications.py
@@ -52,6 +52,7 @@ class Capabilities(enum.Enum):
 
 @enum.unique
 class IsupportTokens(enum.Enum):
+    ACCOUNTEXTBAN = "ACCOUNTEXTBAN"
     BOT = "BOT"
     ELIST = "ELIST"
     INVEX = "INVEX"
diff --git a/pytest.ini b/pytest.ini
index 375f2bb..fe766b5 100644
--- a/pytest.ini
+++ b/pytest.ini
@@ -34,6 +34,7 @@ markers =
     sts
 
     # isupport tokens
+    ACCOUNTEXTBAN
     BOT
     ELIST
     INVEX