DTtest.py
上传用户:gyjinxi
上传日期:2007-01-04
资源大小:159k
文件大小:20k
源码类别:

WEB邮件程序

开发平台:

Python

  1. ##############################################################################
  2. # Zope Public License (ZPL) Version 1.0
  3. # -------------------------------------
  4. # Copyright (c) Digital Creations.  All rights reserved.
  5. # This license has been certified as Open Source(tm).
  6. # Redistribution and use in source and binary forms, with or without
  7. # modification, are permitted provided that the following conditions are
  8. # met:
  9. # 1. Redistributions in source code must retain the above copyright
  10. #    notice, this list of conditions, and the following disclaimer.
  11. # 2. Redistributions in binary form must reproduce the above copyright
  12. #    notice, this list of conditions, and the following disclaimer in
  13. #    the documentation and/or other materials provided with the
  14. #    distribution.
  15. # 3. Digital Creations requests that attribution be given to Zope
  16. #    in any manner possible. Zope includes a "Powered by Zope"
  17. #    button that is installed by default. While it is not a license
  18. #    violation to remove this button, it is requested that the
  19. #    attribution remain. A significant investment has been put
  20. #    into Zope, and this effort will continue if the Zope community
  21. #    continues to grow. This is one way to assure that growth.
  22. # 4. All advertising materials and documentation mentioning
  23. #    features derived from or use of this software must display
  24. #    the following acknowledgement:
  25. #      "This product includes software developed by Digital Creations
  26. #      for use in the Z Object Publishing Environment
  27. #      (http://www.zope.org/)."
  28. #    In the event that the product being advertised includes an
  29. #    intact Zope distribution (with copyright and license included)
  30. #    then this clause is waived.
  31. # 5. Names associated with Zope or Digital Creations must not be used to
  32. #    endorse or promote products derived from this software without
  33. #    prior written permission from Digital Creations.
  34. # 6. Modified redistributions of any form whatsoever must retain
  35. #    the following acknowledgment:
  36. #      "This product includes software developed by Digital Creations
  37. #      for use in the Z Object Publishing Environment
  38. #      (http://www.zope.org/)."
  39. #    Intact (re-)distributions of any official Zope release do not
  40. #    require an external acknowledgement.
  41. # 7. Modifications are encouraged but must be packaged separately as
  42. #    patches to official Zope releases.  Distributions that do not
  43. #    clearly separate the patches from the original work must be clearly
  44. #    labeled as unofficial distributions.  Modifications which do not
  45. #    carry the name Zope may be packaged in any form, as long as they
  46. #    conform to all of the clauses above.
  47. # Disclaimer
  48. #   THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
  49. #   EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  50. #   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  51. #   PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
  52. #   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  53. #   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  54. #   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  55. #   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  56. #   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  57. #   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  58. #   OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  59. #   SUCH DAMAGE.
  60. # This software consists of contributions made by Digital Creations and
  61. # many individuals on behalf of Digital Creations.  Specific
  62. # attributions are listed in the accompanying credits file.
  63. ##############################################################################
  64. """Document Template Tests
  65. """
  66. __rcs_id__='$Id: DTtest.py,v 1.12 1999/03/22 23:19:42 jim Exp $'
  67. __version__='$Revision: 1.12 $'[11:-2]
  68. from DocumentTemplate import *
  69. import sys
  70. class Bruce:
  71.    def __str__(self): return 'bruce'
  72.    def __int__(self): return 42
  73.    def __float__(self): return 42.0
  74.    def keys(self): return ['bruce']*7
  75.    def values(self): return [self]*7
  76.    def items(self): return [('bruce',self)]*7
  77.    def __len__(self): return 7
  78.    def __getitem__(self,index):
  79.        if (type(index) is type(1) and 
  80.            (index < 0 or index > 6)): raise IndexError, index
  81.        return self
  82.    isDocTemp=0
  83.    def __getattr__(self,name):
  84.        if name[:1]=='_': raise AttributeError, name
  85.        return self
  86.    
  87. bruce=Bruce()    
  88. class arg:
  89.     def __init__(self,nn,aa): self.num, self.arg = nn, aa
  90. class argv:
  91.     def __init__(self):
  92.         import sys
  93.         args=self.args=[]
  94.         for aa in sys.argv[1:]: args.append(arg(len(args)+1,aa))
  95.     def items(self):
  96.         return map(lambda a: ('spam%d' % a.num, a), self.args)
  97.     def values(self): return self.args
  98. def test1():
  99.     aa=argv()
  100.     ss=String(
  101.         """
  102.         %(comment)[ blah %(comment)]
  103.         <html><head><title>Test of documentation templates</title></head>
  104.         <body>
  105.         %(if args)[
  106.         <dl><dt>The arguments to this test program were:<p>
  107.         <dd>
  108.         <ul>
  109.         %(in args)[
  110.           <li>Argument number %(num)d was %(arg)s
  111.         %(in args)]
  112.         </ul></dl><p>
  113.         %(if args)]
  114.         %(else args)[
  115.         No arguments were given.<p>
  116.         %(else args)]
  117.         And thats da trooth.
  118.         </body></html>
  119.         """)
  120.     print ss(aa)
  121.     print 'num inaccessible:'
  122.     # ss.names({'args':'args'})
  123.     print ss(aa)
  124.     print 'quoted source:'
  125.     print str(ss)
  126.     try:
  127.         ss(hello=1,world=2)
  128.         print 'test if test failed'
  129.     except: pass
  130.     # Test nested templates
  131.     a=arg(42,'bruce')
  132.     a.header=HTML("<!--#var arg--> data <!--#var num fmt=%d-->:n")
  133.     print String("%(header)s number: %(num)d")(a)
  134. def test2():
  135.     # test1()
  136.     aa=argv()
  137.     print HTML(
  138.         '''
  139.         <html><head><title>Test of documentation templates</title></head>
  140.         <body>
  141.         <!--#if values-->
  142.           The arguments were:
  143.           <!--#in
  144.           values-->
  145.               <!--#var
  146.               sequence-roman-->.
  147.               Argument <!--#var
  148.               num fmt=d--> was <!--#var arg-->
  149.           <!--#/in values-->
  150.         <!--#else values-->
  151.           No arguments were given.<p>
  152.         <!--#/if values-->
  153.         And I'm 100% sure!
  154.         </body></html>
  155.         ''')(aa)
  156. def test3():
  157.     test2()
  158.     aa=argv()
  159.     h=HTML(
  160.         '''
  161.         <html><head><title>Test of documentation templates</title></head>
  162.         <body>
  163.         <!--#if args-->
  164.           The arguments were:
  165.           <!--#in args size=size end=end-->
  166.               <!--#if previous-sequence-->
  167.                  (<!--#var previous-sequence-start-arg-->-
  168.                   <!--#var previous-sequence-end-arg-->)
  169.               <!--#/if previous-sequence-->
  170.               <!--#if sequence-start-->
  171.                  <dl>
  172.               <!--#/if sequence-start-->
  173.               <dt><!--#var sequence-arg-->.</dt>
  174.               <dd>Argument <!--#var num fmt=d--> was <!--#var arg--></dd>
  175.               <!--#if next-sequence-->
  176.                  (<!--#var next-sequence-start-arg-->-
  177.                   <!--#var next-sequence-end-arg-->)
  178.               <!--#/if next-sequence-->
  179.           <!--#/in args-->
  180.           </dl>
  181.         <!--#else args-->
  182.           No arguments were given.<p>
  183.         <!--#/if args-->
  184.         And I'm 100% sure!
  185.         </body></html>
  186.         ''')
  187.     size,orphan=5,0
  188.     for end in range(20):
  189.         end=end+1
  190.         print '='*60, 'n'
  191.         print h(aa,size=size, orphan=orphan, end=end)
  192. def test3_okay(key, val):
  193.     print 'Testing', key
  194.     return 1
  195. def test4():
  196.     def item(key,**kw): return (key,kw)
  197.     def item2(key,**kw): return kw
  198.     class item_class:
  199.         def __init__(self,key,**kw):
  200.             for k in kw.keys(): self.__dict__[k]=kw[k]
  201.     items=(
  202.         item( 1,dealer='Bay Chevy', make='Chevrolet', model='Caprice', year=96),
  203.         item( 2,dealer='Bay Chevy', make='Chevrolet', model='Nova', year=96),
  204.         item( 4,dealer='Bay Chevy', make='Chevrolet', model='Nova', year=96),
  205.         item( 5,dealer='Bay Chevy', make='Chevrolet', model='Nova', year=96),
  206.         item( 3,dealer='Bay Chevy', make='Chevrolet', model='Corvett', year=96),
  207.         item( 6,dealer='Bay Chevy', make='Chevrolet', model='Lumina', year=96),
  208.         item( 7,dealer='Bay Chevy', make='Chevrolet', model='Lumina', year=96),
  209.         item( 8,dealer='Bay Chevy', make='Chevrolet', model='Lumina', year=95),
  210.         item( 9,dealer='Bay Chevy', make='Chevrolet', model='Corsica', year=96),
  211.         item(10,dealer='Bay Chevy', make='Chevrolet', model='Corsica', year=96),
  212.         item(11,dealer='Bay Chevy', make='Toyota', model='Camry', year=95),
  213.         item(12,dealer='Colman Olds', make='Olds', model='Ciera', year=96),
  214.         item(12,dealer='Colman Olds', make='Olds', model='Ciera', year=96),
  215.         item(12,dealer='Colman Olds', make='Olds', model='Ciera', year=96),
  216.         item(12,dealer='Colman Olds', make='Olds', model='Cutlass', year=96),
  217.         item(12,dealer='Colman Olds', make='Olds', model='Cutlas', year=95),
  218.         item(12,dealer='Colman Olds', make='Dodge', model='Shadow', year=93),
  219.         item(12,dealer='Colman Olds', make='Jeep', model='Cheroke', year=94),
  220.         item(12,dealer='Colman Olds', make='Toyota', model='Previa', year=92),
  221.         item(12,dealer='Colman Olds', make='Toyota', model='Celica', year=93),
  222.         item(12,dealer='Colman Olds', make='Toyota', model='Camry', year=93),
  223.         item(12,dealer='Colman Olds', make='Honda', model='Accord', year=94),
  224.         item(12,dealer='Colman Olds', make='Honda', model='Accord', year=92),
  225.         item(12,dealer='Colman Olds', make='Honda', model='Civic', year=94),
  226.         item(12,dealer='Colman Olds', make='Honda', model='Civix', year=93),
  227.         item( 1,dealer='Spam Chev', make='Chevrolet', model='Caprice', year=96),
  228.         item( 2,dealer='Spam Chev', make='Chevrolet', model='Nova', year=96),
  229.         item( 4,dealer='Spam Chev', make='Chevrolet', model='Nova', year=96),
  230.         item( 5,dealer='Spam Chev', make='Chevrolet', model='Nova', year=96),
  231.         item( 3,dealer='Spam Chev', make='Chevrolet', model='Corvett', year=96),
  232.         item( 6,dealer='Spam Chev', make='Chevrolet', model='Lumina', year=96),
  233.         item( 7,dealer='Spam Chev', make='Chevrolet', model='Lumina', year=96),
  234.         item( 8,dealer='Spam Chev', make='Chevrolet', model='Lumina', year=95),
  235.         item( 9,dealer='Spam Chev', make='Chevrolet', model='Corsica', year=96),
  236.         item(10,dealer='Spam Chev', make='Chevrolet', model='Corsica', year=96),
  237.         item(11,dealer='Spam Chevy', make='Toyota', model='Camry', year=95),
  238.         item(12,dealer='Spam Olds', make='Olds', model='Ciera', year=96),
  239.         item(12,dealer='Spam Olds', make='Olds', model='Ciera', year=96),
  240.         item(12,dealer='Spam Olds', make='Olds', model='Ciera', year=96),
  241.         item(12,dealer='Spam Olds', make='Olds', model='Cutlass', year=96),
  242.         item(12,dealer='Spam Olds', make='Olds', model='Cutlas', year=95),
  243.         item(12,dealer='Spam Olds', make='Dodge', model='Shadow', year=93),
  244.         item(12,dealer='Spam Olds', make='Jeep', model='Cheroke', year=94),
  245.         item(12,dealer='Spam Olds', make='Toyota', model='Previa', year=92),
  246.         item(12,dealer='Spam Olds', make='Toyota', model='Celica', year=93),
  247.         item(12,dealer='Spam Olds', make='Toyota', model='Camry', year=93),
  248.         item(12,dealer='Spam Olds', make='Honda', model='Accord', year=94),
  249.         item(12,dealer='Spam Olds', make='Honda', model='Accord', year=92),
  250.         item(12,dealer='Spam Olds', make='Honda', model='Civic', year=94),
  251.         item(12,dealer='Spam Olds', make='Honda', model='Civix', year=93),
  252.         )
  253.     html=HTML(
  254.         '''
  255.         <html><head><title>Inventory by Dealer</title></head><body>
  256.           <dl>
  257.           <!--#in inventory mapping size=5 start=first_ad-->
  258.             <!--#if previous-sequence-->
  259.               <!--#in
  260.               previous-batches mapping-->
  261.                 (<!--#var batch-start-var-dealer-->
  262.                  <!--#var batch-start-var-year-->
  263.                  <!--#var batch-start-var-make-->
  264.                  <!--#var batch-start-var-model-->
  265.                  -
  266.                  <!--#var batch-end-var-dealer-->
  267.                  <!--#var batch-end-var-year-->
  268.                  <!--#var batch-end-var-make-->
  269.                  <!--#var batch-end-var-model-->
  270.                  )
  271.               <!--#/in previous-batches-->
  272.             <!--#/if previous-sequence-->
  273.             <!--#if first-dealer-->
  274.               <dt><!--#var dealer--></dt><dd>
  275.             <!--#/if first-dealer-->
  276.             <!--#var year--> <!--#var make--> <!--#var model--> <p>
  277.             <!--#if last-dealer-->
  278.               </dd>
  279.             <!--#/if last-dealer-->
  280.             <!--#if next-sequence-->
  281.               <!--#in next-batches mapping-->
  282.                 (<!--#var batch-start-var-dealer-->
  283.                  <!--#var batch-start-var-year-->
  284.                  <!--#var batch-start-var-make-->
  285.                  <!--#var batch-start-var-model-->
  286.                  -
  287.                  <!--#var batch-end-var-dealer-->
  288.                  <!--#var batch-end-var-year-->
  289.                  <!--#var batch-end-var-make-->
  290.                  <!--#var batch-end-var-model-->
  291.                  )
  292.               <!--#/in next-batches-->
  293.             <!--#/if next-sequence-->
  294.             <!--#/in inventory-->
  295.           </dl>
  296.         </body></html>
  297.         ''')
  298.     print html(inventory=items, first_ad=15)
  299. def test5():
  300.     html=HTML(
  301.         '''
  302.         <html><head><title>Affiliate Manager Affiliate Menu</title></head><body>
  303.         <CENTER>
  304.         <FONT SIZE="+2">Affiliate Manager Menu</FONT>
  305.         <p>
  306.         
  307.         <!--#if affiliates-->
  308.         Select an affiliate to visit:<br>
  309.         <UL>
  310.         <!--#in affiliates-->
  311.            <LI><A HREF="<!--#var URL1-->/<!--#var ID-->/">
  312.                <!--#var name--></A></LI>
  313.            <!--#/in affiliates-->
  314.         </UL>
  315.         
  316.         <!--#/if affiliates-->
  317.         <p>
  318.         <A HREF="<!--#var URL1-->/add_affiliate_form">Add an affiliate</A>
  319.         
  320.         <!--#if affiliates-->
  321.         * <A HREF="<!--#var URL1-->/delete_affiliates_form">
  322.         Delete affiliates</A>
  323.         <!--#/if affiliates-->
  324.         </p>
  325.         </CENTER>
  326.         </body>
  327.         
  328.         </html>''')
  329.     print html(affiliates=[], URL1='www')
  330. def test6():
  331.     def d(**kw): return kw
  332.     data=(d(name='jim', age=38),
  333.           # d(name='kak', age=40),
  334.           d(name='will', age=7),
  335.           d(name='drew', age=4),
  336.           d(name='ches', age=1),
  337.           )
  338.     html=HTML(
  339.         """Ages:n
  340.         <!--#in data mapping-->
  341.           <!--#if sequence-end-->
  342.              ---------------
  343.              for variable name:
  344.              min:    <!--#var min-name-->
  345.              max:    <!--#var max-name-->
  346.              count:  <!--#var count-name-->
  347.              total:  <!--#var total-name-->
  348.              median: <!--#var median-name-->
  349.              ---------------
  350.              for variable age:
  351.              min:    <!--#var min-age-->
  352.              max:    <!--#var max-age-->
  353.              count:  <!--#var count-age-->
  354.              total:  <!--#var total-age-->
  355.              median: <!--#var median-age-->
  356.              mean:   <!--#var mean-age-->
  357.              s.d.    <!--#var standard-deviation-age-->
  358.              ---------------
  359.           <!--#/if sequence-end-->
  360.         <!--#/in data-->
  361.         """)
  362.     print html(data=data)
  363. def test7():
  364.     import DateTime
  365.     html=HTML("""
  366.     <!--#var name capitalize spacify--> is
  367.     <!--#var date fmt=year-->/<!--#var date fmt=month-->/<!--#var date fmt=day-->
  368.     """)
  369.     html.names({'name':'name', 'date':'date'})
  370.     print html(date=DateTime.DateTime(),
  371.                name='todays_date')
  372. def test8():
  373.     import DateTime
  374.     html=String("""
  375.     %(name capitalize spacify)s is
  376.     %(date fmt=year)s/%(date fmt=month)s/%(date fmt=day)s
  377.     """)
  378.     print html(date=DateTime.DateTime(),
  379.                name='todays_date')
  380. def test9():
  381.     html=HTML(
  382.         """
  383. <!--#in spam-->
  384. <!--#in sequence-item-->
  385.    <!--#var sequence-item-->
  386. <!--#/in sequence-item-->
  387. <!--#/in spam-->
  388.         """)
  389.     print html(spam=[[1,2,3],[4,5,6]])
  390. def test9a():
  391.     html=HTML(
  392.         """
  393.         <!--#in spam-->
  394.            <!--#in sequence-item-->
  395.               <!--#var sequence-item-->
  396.            <!--#/in sequence-item-->
  397.         <!--#/in spam-->
  398.         """)
  399.     print html(spam=[[1,2,3],[4,5,6]])
  400. def test10():
  401.     #import Missing
  402.     html=HTML(
  403.         """
  404.               <!--#var spam fmt="$%.2f bob's your uncle" null="spam%eggs!|"-->
  405.         """) #'
  406.     print html(spam=42)
  407.     print html(spam=None)
  408.     #print html(spam=Missing.Value)
  409.     
  410. def test11():
  411.     #import Missing
  412.     html=HTML(
  413.         """
  414.                   <!--#var spam -->
  415.         html:     <!--#var spam fmt=html-quote-->
  416.         url:      <!--#var spam fmt=url-quote-->
  417.         multi:    <!--#var spam fmt=multi-line-->
  418.         dollars:  <!--#var spam fmt=whole-dollars-->
  419.         cents:    <!--#var spam fmt=dollars-and-cents-->
  420.         dollars,: <!--#var spam fmt=dollars-with-commas-->
  421.         cents,:   <!--#var spam fmt=dollars-and-cents-with-commas-->
  422.         """)
  423.     
  424.     print html(spam=4200000)
  425.     print html(spam=None)
  426.     print html(spam='<a href="spam">nfoo bar')
  427.     # print html(spam=Missing.Value)
  428.     
  429. class test12ob:
  430.     def __init__(self,**kw):
  431.         for k,v in kw.items(): self.__dict__[k]=v
  432.     def puke(self):
  433.         raise 'Puke', 'raaalf'
  434. def test12():
  435.     class foo:
  436.         def __len__(self): return 9
  437.         def __getitem__(self,i):
  438.             if i >= 9: raise IndexError, i
  439.             return test12ob(index=i, value='item %s' % i)
  440.     html=HTML(
  441.         """
  442.         <!--#if spam-->
  443.         <!--#in spam-->
  444.            <!--#var value-->
  445.            <!--#var puke-->
  446.         <!--#/in spam-->
  447.         <!--#/if spam-->
  448.         """)
  449.     try: print html(spam=foo())
  450.     except: return
  451.     raise 'DocumentTemplate bug', (
  452.         'Puke error not properly propigated in test 12')
  453.    
  454. def test13():
  455.    "Test automatic rendering of callable obnjects"
  456.    class C:
  457.       x=1
  458.       def y(self): return self.x*2
  459.       h=HTML("The h method, <!--#var x--> <!--#var y-->")
  460.       h2=HTML("The h2 method")
  461.    print HTML("<!--#var x-->, <!--#var y-->, <!--#var h-->")(C())
  462.    print HTML(
  463.       """
  464.       <!--#var expr="_.render(i.x)"-->, 
  465.       <!--#var expr="_.render(i.y)"-->, 
  466.       <!--#var expr="_.render(i.h2)"-->""")(i=C())
  467. def test14():
  468.     # test with tag
  469.     class person:
  470.         name='Jim'
  471.         height_inches=73
  472.     print HTML("""<!--#with person-->
  473.     Hi, my name is <!--#var name-->
  474.     My height is <!--#var "height_inches*2.54"--> centimeters.
  475.     <!--#/with-->""")(person=person)
  476. def test15():
  477.     # test raise tag
  478.     try:
  479.         print HTML("""<!--#raise IndexError-->
  480.         The raise tag test suceeded!
  481.         <!--#/raise-->""")()
  482.     except IndexError, v:
  483.         print v
  484. def main():
  485.         import traceback
  486.         print 'Test 1', '='*60
  487.         try: test1()
  488.         except: traceback.print_exc()
  489.         print 'Test 2', '='*60
  490.         try: test2()
  491.         except: traceback.print_exc()
  492.         print 'Test 3', '='*60
  493.         try: test3()
  494.         except: traceback.print_exc()
  495.         print 'Test 4', '='*60
  496.         try: test4()
  497.         except: traceback.print_exc()
  498.         print 'Test 5', '='*60
  499.         try: test5()
  500.         except: traceback.print_exc()
  501.         print 'Test 6', '='*60
  502.         try: test6()
  503.         except: traceback.print_exc()
  504.         print 'Test 9', '='*60
  505.         try: test9()
  506.         except: traceback.print_exc()
  507.         print 'Test 9a', '='*60
  508.         try: test9a()
  509.         except: traceback.print_exc()
  510.         print 'Test 10', '='*60
  511.         try: test10()
  512.         except: traceback.print_exc()
  513.         print 'Test 11', '='*60
  514.         try: test11()
  515.         except: traceback.print_exc()
  516.         print 'Test 14', '='*60
  517.         try: test14()
  518.         except: traceback.print_exc()
  519.         print 'Test 15', '='*60
  520.         try: test15()
  521.         except: traceback.print_exc()
  522.     
  523. if __name__ == "__main__":
  524.     try: command=sys.argv[1]
  525.     except: command='main'
  526.     globals()[command]()