Students:  Here is how you do today's first exercise, in m1_Line.

########################################################################

WITH YOUR INSTRUCTOR:

  1. Understand the Point class that we supplied.

  2. Understand how this exercise works:
     -- You will implement a ** Line ** class.
     -- In doing so, you will (many times) use methods from the Point class.
     -- Implement and test the methods of the Line class, one by one,
          ** using the process described BELOW. **

  3. Understand enough about the tests that WE supplied for you to
       succeed in this project.
       ** ALL FAILURES IN OUR TESTS ARE PRINTED IN   ** RED **.
       ** ASK FOR HELP AS NEEDED if our testing code BREAKS
           (because of an error in YOUR code).

  4. Practice what you will do, by (with your instructor) implementing
       and testing the   __init__   method of the Line class,
         ** using the process described BELOW. **
  
  5. Do the remaining methods of the Line class, one by one,
         ** using the process described BELOW. **
 
########################################################################

Here is the PROCESS you will use to implement and test
each method   M   of the Line class.
(For example, M might be the   reverse   method.)

  a. READ method M's specification, including its Example.
        ** ASK QUESTIONS AS NEEDED. **
        ** Be sure you understand it, ESPECIALLY the Example.
  
  b. Implement and test method M.
       The tests are already written (below).
       They include the Example in method M's green doc-string.

########################################################################
Here is a BRIEF description of OUR tests, using the   reverse   method
as an example.  ASK YOUR INSTRUCTOR FOR HELP as needed with OUR tests.

    def run_test_reverse():
        """ Tests the   reverse   method of the Line class. """
        
        m1t.run_test_reverse()  # This runs OUR tests.
        
        # --------------------------------------------------------------
        # One ADDITIONAL test (or set of tests).
        # --------------------------------------------------------------
        p1 = Point(30, 17)
        p2 = Point(50, 80)
        line1 = Line(p1, p2)
        line2 = line1.clone()
    
        print(line1)  # Should print: Line[(30, 17), (50, 80)]
    
        line1.reverse()
        print(line1)  # Should print: Line[(50, 80), (30, 17)]
        print(line1 == line2)  # Should print: False
    
        line1.reverse()
        print(line1 == line2)  # Should now print: True
    
        print('The above should print:')
        print('  Line[(30, 17), (50, 80)]')
        print('  Line[(50, 80), (30, 17)')
        print('  False')
        print('  True')

OUR tests are called by the statement:
        m1t.run_test_reverse()  # This runs OUR tests.
So OUR tests run first, THEN the test(s) that came from the Example
in the method's specification.

IMPORTANT: We supplied lots of tests.  They are all in the
   m1t_test_Line   module. Some of the tests that we wrote may be
   difficult for you to grasp.  Don't hesitate to ASK QUESTIONS
   if you do not understand a test that your code is failing.

Here is part of our tests of the   reverse   method, as an example:

    line = m1.Line(m1.Point(12, 88),
                   m1.Point(40, 33))
    original_end = line.end
    line.reverse()

    expected = original_end
    actual = line.start
    evaluate_test(expected, actual, 'Testing START after 1st reverse:')

The function
    evaluate_test
simply tests whether the   expected  and   actual   are equal
to each other and prints relevant messages.

Note: We wrote the  main  function in such a way that it will
NOT call your  TEST  function until you write at least SOME
code in the method to be tested.  So, you will not any output
from a TEST function until you start implementing its method.
########################################################################