truth table: Nullary and Unary Operations


preview

Here are the tests I have at the end of the chapters

 1import src.truth_table
 2import unittest
 3
 4
 5class TestNullaryOperations(unittest.TestCase):
 6
 7    def test_logical_true(self):
 8        self.assertTrue(src.truth_table.logical_true())
 9
10    def test_logical_false(self):
11        self.assertFalse(src.truth_table.logical_false())
12
13
14class TestUnaryOperations(unittest.TestCase):
15
16    def test_logical_identity(self):
17        self.assertTrue(src.truth_table.logical_identity(True))
18        self.assertFalse(src.truth_table.logical_identity(False))
19
20    def test_logical_negation_aka_not(self):
21        self.assertFalse(src.truth_table.logical_negation(True))
22        self.assertTrue(src.truth_table.logical_negation(False))
23
24
25# Exceptions seen
26# AssertionError
27# AttributeError
28# TypeError

questions about Nullary and Unary Operations

Here are questions you can answer after going through this chapter


requirements

truth table


Nullary Operations

There are 2 Nullary operations - Logical True and Logical False. They do not take input and always return True or False


test_logical_true


RED: make it fail


  • I change the name of test_truth_table.py to test_nullary_unary.py

  • I change the names of the class and method in test_nullary_unary.py

     1import src.truth_table
     2import unittest
     3
     4
     5class TestNullaryOperations(unittest.TestCase):
     6
     7    def test_logical_true(self):
     8        self.assertTrue(src.truth_table.logical_true())
     9
    10
    11# Exceptions seen
    

    the terminal shows AttributeError

    AttributeError: module 'src.truth_table' has no attribute 'logical_true'
    

    I have not added a definition for logical_true to truth_table.py in the src folder


GREEN: make it pass


logical_true does not take any input and always returns True


test_logical_false


RED: make it fail


I add another test to test_nullary_unary.py

 5class TestNullaryOperations(unittest.TestCase):
 6
 7    def test_logical_true(self):
 8        self.assertTrue(src.truth_table.logical_true())
 9
10    def test_logical_false(self):
11        self.assertFalse(src.truth_table.logical_false())
12
13
14# Exceptions seen

the terminal shows AttributeError

AttributeError: module 'src.truth_table' has no attribute 'logical_false'. Did you mean: 'logical_true'?

I have not added a definition for logical_false to truth_table.py, I only added one for logical_true


GREEN: make it pass


  • I add a function to truth_table.py

    1def logical_true():
    2    return True
    3
    4
    5def logical_false():
    6    return True
    

    the terminal shows AssertionError

    AssertionError: True is not false
    
  • I change True to False in the return statement

    5def logical_false():
    6    return False
    

    the test passes

Note


Unary Operations

There are 2 unary operations: Logical Identity and Logical Negation, they each take one input and return True or False


test_logical_identity


RED: make it fail


I add a new TestCase for Unary Operations with a test to test_nullary_unary.py

 5class TestNullaryOperations(unittest.TestCase):
 6
 7    def test_logical_true(self):
 8        self.assertTrue(src.truth_table.logical_true())
 9
10    def test_logical_false(self):
11        self.assertFalse(src.truth_table.logical_false())
12
13
14class TestUnaryOperations(unittest.TestCase):
15
16    def test_logical_identity(self):
17        self.assertTrue(src.truth_table.logical_identity(True))
18
19
20# Exceptions seen

the terminal shows AttributeError

AttributeError: module 'src.truth_table' has no attribute 'logical_identity'

I need to add a definition for it


GREEN: make it pass


  • I add the function to truth_table.py

     5def logical_false():
     6    return False
     7
     8
     9def logical_identity():
    10    return False
    

    the terminal shows TypeError

    TypeError: logical_identity() takes 0 positional arguments but 1 was given
    

    I need to make the function accept input since the test sends True as input

  • I add TypeError to the list of Exceptions seen in test_nullary_unary.py

    20# Exceptions seen
    21# AssertionError
    22# AttributeError
    23# TypeError
    
  • I add a name in parentheses for logical_identity to take input in truth_table.py

     9def logical_identity(the_input):
    10    return False
    

    the terminal shows AssertionError

    AssertionError: False is not true
    
  • I change the return statement

     9def logical_identity(the_input):
    10    return True
    

    the test passes


REFACTOR: make it better


  • I add another line to test_logical_identity in test_nullary_unary.py for the case when it gets False as input

    16    def test_logical_identity(self):
    17        self.assertTrue(src.truth_table.logical_identity(True))
    18        self.assertFalse(src.truth_table.logical_identity(False))
    

    the terminal shows AssertionError

    AssertionError: True is not false
    
  • I change the return statement of logical_identity in truth_table.py

     9def logical_identity(the_input):
    10    return False
    

    the terminal shows AssertionError

    AssertionError: False is not true
    

    there is a failure for the test that passed before. The expectation of the test is that

    • if True is given, the result is True

    • if False is given, the result is False

    • if input is given, the result is the input

  • I change the return statement of the function

     9def logical_identity(the_input):
    10    return the_input
    

    the test passes. the_input is a name, I can use any name.

logical_identity returns its input as output


test_logical_negation


RED: make it fail


I add a test for logical_negation to test_nullary_unary.py

14class TestUnaryOperations(unittest.TestCase):
15
16    def test_logical_identity(self):
17        self.assertTrue(src.truth_table.logical_identity(True))
18        self.assertFalse(src.truth_table.logical_identity(False))
19
20    def test_logical_negation(self):
21        self.assertFalse(src.truth_table.logical_negation(True))
22
23
24# Exceptions seen

the terminal shows AttributeError

AttributeError: module 'src.truth_table' has no attribute 'logical_negation'

GREEN: make it pass


I add a definition for the function in truth_table.py

 9def logical_identity(the_input):
10    return the_input
11
12
13def logical_negation(the_input):
14    return the_input

the terminal shows AssertionError

AssertionError: True is not false

I change the return statement

13def logical_negation(the_input):
14    return False

the test passes


REFACTOR: make it better


  • I add another line to test_logical_negation in test_nullary_unary.py

    20    def test_logical_negation(self):
    21        self.assertFalse(src.truth_table.logical_negation(True))
    22        self.assertTrue(src.truth_table.logical_negation(False))
    

    the terminal shows AssertionError

    AssertionError: False is not true
    
  • I change the return statement of the logical_negation function in truth_table.py

    13def logical_negation(the_input):
    14    return True
    

    the terminal shows AssertionError

    AssertionError: True is not false
    

    the test fails for the line that passed before

  • I make the function return its input again

    13def logical_negation(the_input):
    14    return the_input
    

    the terminal shows AssertionError

    AssertionError: True is not false
    

    the expectation of the test is

    • if True is given, the result is False

    • if False is given, the result is True

    • if input is given, the result is the opposite of the input, it is “not” the input


how to return the opposite of a boolean


  • I can use the “not” keyword to return the opposite of the boolean after it. I add it to the return statement

    13def logical_negation(the_input):
    14    return not the_input
    

    the test passes

  • I add to the name of the test

    14class TestUnaryOperations(unittest.TestCase):
    15
    16    def test_logical_identity(self):
    17        self.assertTrue(src.truth_table.logical_identity(True))
    18        self.assertFalse(src.truth_table.logical_identity(False))
    19
    20    def test_logical_negation_aka_not(self):
    21        self.assertFalse(src.truth_table.logical_negation(True))
    22        self.assertTrue(src.truth_table.logical_negation(False))
    23
    24
    25# Exceptions seen
    

logical_negation also known as not returns the opposite of its input


close the project

  • I close test_nullary_unary.py and truth_table.py in the editor

  • I click in the terminal and use q on the keyboard to leave the tests and the terminal goes back to the command line

  • I change directory to the parent of truth_table

    cd ..
    

    the terminal shows

    .../pumping_python
    

    I am back in the pumping_python directory


review

I ran the following tests for Nullary Operations which take no input

and for Unary operations which take 1 input

How many questions can you answer after going through this chapter?


code from the chapter

Do you want to see all the CODE I typed for the Truth Table?


what is next?

Would you like to test binary operations? they take 2 inputs


rate pumping python

If this has been a 7 star experience for you, please CLICK HERE to leave a 5 star review of pumping python. It helps other people get into the book too