Explicitly invoke Python 3.x in shebang lines
[mudpy.git] / bin / test
index 925e558..d37aca5 100755 (executable)
--- a/bin/test
+++ b/bin/test
@@ -1,12 +1,13 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 """Regression test script for the mudpy engine."""
 
-# Copyright (c) 2004-2015 Jeremy Stanley <fungi@yuggoth.org>. Permission
+# Copyright (c) 2004-2016 Jeremy Stanley <fungi@yuggoth.org>. Permission
 # to use, copy, modify, and distribute this software is granted under
 # terms provided in the LICENSE file distributed with this software.
 
 import sys
 import telnetlib
+import time
 
 test_account0_setup = (
     (0, "Identify yourself:", "luser0"),
@@ -88,7 +89,7 @@ test_sentence_capitalization = (
 
 test_chat_mode = (
     (1, '> ', "chat"),
-    (1, '> \(chat\) ', "Feeling chatty."),
+    (1, '(?s)Entering chat mode .*> \(chat\) ', "Feeling chatty."),
     (1, 'You say, "Feeling chatty\."', "!chat"),
     (0, 'says, "Feeling chatty\."', ""),
     (1, '> ', "say Now less chatty."),
@@ -96,20 +97,33 @@ test_chat_mode = (
     (0, 'says, "Now less chatty\."', ""),
 )
 
+test_movement = (
+    (0, "> ", "move north"),
+    (0, "You exit to the north\.", ""),
+    (1, "exits to the north\.", "move north"),
+    (0, "arrives from the south\.", "move south"),
+    (0, "You exit to the south\.", ""),
+    (1, "exits to the south\.", "move south"),
+    (0, "arrives from the north\.", "move east"),
+    (0, "You exit to the east\.", ""),
+    (1, "exits to the east\.", "move east"),
+    (0, "arrives from the west\.", "move west"),
+    (0, "You exit to the west\.", ""),
+    (1, "exits to the west\.", "move west"),
+    (0, "arrives from the east\.", "move up"),
+    (0, "You exit upward\.", ""),
+    (1, "exits upward\.", "move up"),
+    (0, "arrives from below\.", "move down"),
+    (0, "You exit downward\.", ""),
+    (1, "exits downward\.", "move down"),
+    (0, "arrives from above\.", ""),
+)
+
 test_actor_disappears = (
     (1, "> ", "quit"),
     (0, "You suddenly wonder where .* went\.", ""),
 )
 
-test_account0_teardown = (
-    (0, "> ", "quit"),
-    (0, "What would you like to do?", "d"),
-    (0, "Whom would you like to delete?", ""),
-    (0, "What would you like to do?", "p"),
-    (0, "permanently delete your account?", "y"),
-    (0, "Disconnecting...", ""),
-)
-
 test_account1_teardown = (
     (1, "What would you like to do?", "d"),
     (1, "Whom would you like to delete?", ""),
@@ -118,6 +132,30 @@ test_account1_teardown = (
     (1, "Disconnecting...", ""),
 )
 
+test_admin_setup = (
+    (2, "Identify yourself:", "testadmin"),
+    (2, "Enter your choice:", "n"),
+    (2, "Enter a new password for \"testadmin\":", "Test789"),
+    (2, "Enter the same new password again:", "Test789"),
+    (2, "What would you like to do\?", "c"),
+    (2, "Pick a birth gender for your new avatar:", "m"),
+    (2, "Choose a name for him:", "1"),
+    (2, "What would you like to do?", "a"),
+    (2, "Whom would you like to awaken?", ""),
+)
+
+test_admin_restriction = (
+    (0, "> ", "help halt"),
+    (0, "That is not an available command\.", "halt"),
+    (0, '(not sure what "halt" means|Arglebargle, glop-glyf)', ""),
+)
+
+test_admin_help = (
+    (2, "> ", "help"),
+    (2, "halt.*Shut down the world\.", "help halt"),
+    (2, "This will save all active accounts", ""),
+)
+
 dialogue = (
     (test_account0_setup, "first account setup"),
     (test_account1_setup, "second account setup"),
@@ -127,18 +165,23 @@ dialogue = (
     (test_typo_replacement, "typo replacement"),
     (test_sentence_capitalization, "sentence capitalization"),
     (test_chat_mode, "chat mode"),
+    (test_movement, "movement"),
     (test_actor_disappears, "actor spontaneous disappearance"),
-    (test_account0_teardown, "first account teardown"),
     (test_account1_teardown, "second account teardown"),
+    (test_admin_setup, "admin account setup"),
+    (test_admin_restriction, "restricted admin commands"),
+    (test_admin_help, "admin help"),
 )
 
-captures = ["", ""]
-lusers = [telnetlib.Telnet(), telnetlib.Telnet()]
+captures = ["", "", ""]
+lusers = [telnetlib.Telnet(), telnetlib.Telnet(), telnetlib.Telnet()]
 success = True
+start = time.time()
 for luser in lusers:
     luser.open("::1", 6669)
 for test, description in dialogue:
     print("\nTesting %s..." % description)
+    test_start = time.time()
     for conversant, question, answer in test:
         print("luser%s waiting for: %s" % (conversant, question))
         index, match, received = lusers[conversant].expect(
@@ -160,6 +203,9 @@ for test, description in dialogue:
         captures[conversant] += "%s\r\n" % answer
     if not success:
         break
+    print("Completed in %.3f seconds." % (time.time() - test_start))
+duration = time.time() - start
+print("")
 for conversant in range(len(captures)):
     try:
         captures[conversant] += lusers[
@@ -167,8 +213,14 @@ for conversant in range(len(captures)):
     except:
         pass
     lusers[conversant].close()
-    log = open("capture_%s.log" % conversant, "w")
+    logfile = "capture_%s.log" % conversant
+    print("Recording session %s as %s." % (conversant, logfile))
+    log = open(logfile, "w")
     log.write(captures[conversant])
     log.close()
-if not success:
+print("\nRan %s tests in %.3f seconds." % (len(dialogue), duration))
+if success:
+    print("SUCCESS")
+else:
+    print("FAILURE")
     sys.exit(1)