truth table: Nullary and Unary Operations
preview
These 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(
9 src.truth_table.logical_true()
10 )
11
12 def test_logical_false(self):
13 self.assertFalse(
14 src.truth_table.logical_false()
15 )
16
17
18class TestUnaryOperations(unittest.TestCase):
19
20 def test_logical_identity(self):
21 self.assertTrue(
22 src.truth_table.logical_identity(True)
23 )
24 self.assertFalse(
25 src.truth_table.logical_identity(False)
26 )
27
28 def test_logical_negation_aka_not(self):
29 self.assertFalse(
30 src.truth_table.logical_negation(True)
31 )
32 self.assertTrue(
33 src.truth_table.logical_negation(False)
34 )
35
36
37# Exceptions seen
38# AssertionError
39# AttributeError
40# TypeError
questions about Nullary and Unary Operations
Questions to think about as I go through the chapter
requirements
Nullary Operations
There are 2 Nullary operations - Logical True and Logical False. They do not take input and always return False or True.
test_logical_true
RED: make it fail
I change the name of
test_truth_table.pytotest_nullary_unary.pyI change the name of the class from
TestTruthTabletoTestNullaryOperationsand test_failure to test_logical_true intest_nullary_unary.py1import src.truth_table 2import unittest 3 4 5class TestNullaryOperations(unittest.TestCase): 6 7 def test_logical_true(self): 8 self.assertTrue( 9 src.truth_table.logical_true() 10 ) 11 12 13# Exceptions seen 14# AssertionErrorthe terminal is my friend, and shows AttributeError
AttributeError: module 'src.truth_table' has no attribute 'logical_true'because I have not added a definition for logical_true to
truth_table.pyin thesrcfolder.
GREEN: make it pass
I add AttributeError to the list of Exceptions seen in
test_nullary_unary.py13# Exceptions seen 14# AssertionError 15# AttributeErrorI open
truth_table.pyfrom thesrcfolder of my Integrated Development Environment (IDE)I remove all the text in the file then add a function to
truth_table.py1def logical_true(): 2 return Nonethe terminal is my friend, and shows AssertionError
AssertionError: None is not truebecause the function returns None and the assertion expects True.
I change None to True in the return statement
1def logical_true(): 2 # return None 3 return Truethe test passes.
I remove the commented line
1def logical_true(): 2 return TrueI open a new terminal, then add the new files and folder to git for tracking
git add .I add a git commit message
git commit -am 'add logical_true'
logical_true does not take any input and always returns True.
test_logical_false
RED: make it fail
I go back to the terminal where the tests are running
I add a test for logical_false to
test_nullary_unary.py7 def test_logical_true(self): 8 self.assertTrue( 9 src.truth_table.logical_true() 10 ) 11 12 def test_logical_false(self): 13 self.assertFalse( 14 src.truth_table.logical_false() 15 ) 16 17 18# Exceptions seenthe terminal is my friend, and shows AttributeError
AttributeError: module 'src.truth_table' has no attribute 'logical_false'. Did you mean: 'logical_true'?because 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.py1def logical_true(): 2 return True 3 4 5def logical_false(): 6 return Truethe terminal is my friend, and shows AssertionError
AssertionError: True is not falsebecause the function returns True and the assertion expects False.
I change True to False in the return statement
5def logical_false(): 6 # return True 7 return Falsethe test passes.
I remove the commented line
5def logical_false(): 6 return FalseI add a git commit message in the other terminal
git commit -am 'add logical_false'logical_true always returns True
logical_false always returns False
the two Nullary Operations do not take input
return
operation
True
False
Unary Operations
There are 2 unary operations: Logical Identity and Logical Negation, they each take one input and return False or True.
test_logical_identity
RED: make it fail
I go back to the terminal where the tests are running
I add a new TestCase for Unary Operations with a test for logical_identity when it gets True as input
input
output
True
True
5class TestNullaryOperations(unittest.TestCase): 6 7 def test_logical_true(self): 8 self.assertTrue( 9 src.truth_table.logical_true() 10 ) 11 12 def test_logical_false(self): 13 self.assertFalse( 14 src.truth_table.logical_false() 15 ) 16 17 18class TestUnaryOperations(unittest.TestCase): 19 20 def test_logical_identity(self): 21 self.assertTrue( 22 src.truth_table.logical_identity(True) 23 ) 24 25 26# Exceptions seenthe terminal is my friend, and shows AttributeError
AttributeError: module 'src.truth_table' has no attribute 'logical_identity'because I need to add a definition for logical_identity to
truth_table.py
GREEN: make it pass
I add the function to
truth_table.py5def logical_false(): 6 return False 7 8 9def logical_identity(): 10 return Falsethe terminal is my friend, and shows TypeError
TypeError: logical_identity() takes 0 positional arguments but 1 was givenbecause the test called the logical_identity function with 1 argument and the definition does not allow any arguments (the parentheses are empty).
I add TypeError to the list of Exceptions seen in
test_nullary_unary.py26# Exceptions seen 27# AssertionError 28# AttributeError 29# TypeErrorI add a name in parentheses so that logical_identity can take calls with one input, in
truth_table.py9# def logical_identity(): 10def logical_identity(the_input): 11 return Falsethe terminal is my friend, and shows AssertionError
AssertionError: False is not truebecause the function returns False and the assertion expects True
I change the return statement to give the test what it wants
9# def logical_identity(): 10def logical_identity(the_input): 11 # return False 12 return Truethe test passes.
REFACTOR: make it better
I add another assertion to test_logical_identity in
test_nullary_unary.pyfor the case when it gets False as inputinput
output
False
False
16 def test_logical_identity(self): 17 self.assertTrue( 18 src.truth_table.logical_identity(True) 19 ) 20 self.assertFalse( 21 src.truth_table.logical_identity(False) 22 ) 23 24 25# Exceptions seenthe terminal is my friend, and shows AssertionError
AssertionError: True is not falsebecause the function returns True and the assertion expects False.
I change the return statement of logical_identity in
truth_table.py9# def logical_identity(): 10def logical_identity(the_input): 11 return False 12 # return Truethe terminal is my friend, and shows AssertionError
AssertionError: False is not truebecause the assertion that was passing before, expects True and the function now returns False.
I change the return statement of the function
9# def logical_identity(): 10def logical_identity(the_input): 11 # return False 12 # return True 13 return the_inputthe test passes.
I remove the commented lines
5def logical_false(): 6 return False 7 8 9def logical_identity(the_input): 10 return the_inputI add a git commit message in the other terminal
git commit -am 'add logical_identity'
This is what happens when the logical_identity function is called
it returns True, if the input is True
it returns False, if the input is False
it returns the input as output
Tip
the_input is a name, I can use any name.
input |
output |
|---|---|
True |
True |
False |
False |
test_logical_negation
RED: make it fail
I add a test for logical_negation with an assertion for when it gets True as input, to test_nullary_unary.py
input |
output |
|---|---|
True |
False |
20 def test_logical_identity(self):
21 self.assertTrue(
22 src.truth_table.logical_identity(True)
23 )
24 self.assertFalse(
25 src.truth_table.logical_identity(False)
26 )
27
28 def test_logical_negation(self):
29 self.assertFalse(
30 src.truth_table.logical_negation(True)
31 )
32
33
34# Exceptions seen
the terminal is my friend, and shows AttributeError
AttributeError: module 'src.truth_table'
has no attribute 'logical_negation'
there is no definition for logical_negation in truth_table.py
GREEN: make it pass
I add the function to
truth_table.py9def logical_identity(the_input): 10 return the_input 11 12 13def logical_negation(the_input): 14 return the_inputthe terminal is my friend, and shows AssertionError
AssertionError: True is not falsebecause the function returned True and the assertion expects False.
I change the return statement to give the test what it wants
13def logical_negation(the_input): 14 # return the_input 15 return Falsethe test passes.
REFACTOR: make it better
I add another assertion to test_logical_negation for when logical_negation gets False as input, in
test_nullary_unary.pyinput
output
False
True
28 def test_logical_negation(self): 29 self.assertFalse( 30 src.truth_table.logical_negation(True) 31 ) 32 self.assertTrue( 33 src.truth_table.logical_negation(False) 34 ) 35 36 37# Exceptions seenthe terminal is my friend, and shows AssertionError
AssertionError: False is not truebecause the function returns False and the new assertion expects True.
I change the return statement of the logical_negation function in
truth_table.py13def logical_negation(the_input): 14 # return the_input 15 # return False 16 return Truethe terminal is my friend, and shows AssertionError
AssertionError: True is not falsethe test fails for the assertion that passed before, because the function now returns True and that assertion expects False.
I make the function return its input again
13def logical_negation(the_input): 14 return the_input 15 # return False 16 # return Truethe terminal is my friend, and shows AssertionError
AssertionError: True is not falsethis means the expectation of the test is that the logical_negation function
returns True if the input is False
returns False if the input is True
returns the opposite of the input it gets
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 15 # return the_input 16 # return False 17 # return Truethe test passes.
I remove the commented lines
13def logical_negation(the_input): 14 return not the_inputThis is what happens when the logical_negation function is called
I add to the name of the test
18class TestUnaryOperations(unittest.TestCase): 19 20 def test_logical_identity(self): 21 self.assertTrue( 22 src.truth_table.logical_identity(True) 23 ) 24 self.assertFalse( 25 src.truth_table.logical_identity(False) 26 ) 27 28 def test_logical_negation_aka_not(self): 29 self.assertFalse( 30 src.truth_table.logical_negation(True) 31 ) 32 self.assertTrue( 33 src.truth_table.logical_negation(False) 34 ) 35 36 37# Exceptions seenI add a git commit message in the other terminal
git commit -am 'add logical_negation'
logical_negation also known as not returns the opposite of its input
input |
output |
|---|---|
True |
False |
False |
True |
close the project
I close
test_nullary_unary.pyandtruth_table.pyI click in the terminal where the tests are running
I use q on the keyboard to leave the tests. The terminal goes back to the command line.
I change directory to the parent of
truth_tablecd ..the terminal shows
.../pumping_pythonI am back in the
pumping_pythondirectory.
review
I ran these tests for Nullary Operations which take no input
and for Unary operations which take one input
the truth table for Unary Operations is
return |
True |
False |
operation |
|---|---|---|---|
the_input |
True |
False |
|
not the_input |
False |
True |
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 Nullary and Unary Operations?
what is next?
Would you like to test binary operations? they take only two 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.