Python Qualis Fresco Play Handson Solution Hacker Rank

Complete solution for Python Qualis Fresco Play Hands-on, solve Python Testing module UnitTest DocTest PyTest exercise,crack Fresco play challenge.
Python Qualis Fresco Play Handson  Solution Hacker Rank  - www.pdfcup.com

Kindly Note: If you had any problems, please comment below.

LAB 1: Welcome to Unit Testing using doctest in Python : Hands on doctest

Problem 1: Unit Testing using doctest

Solution 1: Unit Testing using doctest

#!/bin/python3

import os
import sys
import math
import random
import re
import inspect

# Complete the following isPalindrome function:
#

def isPalindrome(x):

    # Write the doctests:
    """Checking Palindrome of number

    >>>isPalindrome(121)

    True    

    >>>isPalindrome(344)

    False    

    >>>isPalindrome(-121)

    Traceback (most recent call last)

    ValueError: x must be a positive integer    

    >>>isPalindrome("hello")

    Traceback (most recent call last)

    TypeError: x must be an integer

    """

    # Write the functionality:   

    try:
        if not isinstance(x,int):
            raise TypeError

        if x < 0:
            raise ValueError
        else:            

            x_string=str(x)
            x_reverse=list(reversed(x_string))
            flag=True
            for i in range(len(x_string)):
                if x_string[i] != x_reverse[i]:
                    flag=False
                    break
            return flag

    except ValueError :
        raise ValueError("x must be a positive integer")

    except TypeError:
        raise TypeError("x must be an integer")   

 
    # Refer '__main__' method code which is given below if required.     
  
# if __name__ == '__main__':
if __name__ == '__main__':
    fptr = open(os.environ['OUTPUT_PATH'], 'w')
    x = input()    

    if x.isdigit():
        x = int(x)

    res = isPalindrome(x)   
    doc = inspect.getdoc(isPalindrome)   

    func_count = len(re.findall(r'isPalindrome', doc))
    true_count = len(re.findall(r'True', doc))
    false_count = len(re.findall(r'False', doc))
    pp_count = len(re.findall(r'>>>', doc))
    trace_count = len(re.findall(r'Traceback', doc))
    fptr.write(str(res)+'\n')
    fptr.write(str(func_count)+'\n')
    fptr.write(str(true_count)+'\n')
    fptr.write(str(false_count)+'\n')
    fptr.write(str(pp_count) + '\n')
    fptr.write(str(trace_count) + '\n')
    fptr.close()

  

Problem 2: Unit Testing using doctest

Solution 2: Unit Testing using doctest

#!/bin/python3

import inspect
import doctest
import math
import re

# Define the class 'Circle' and its methods with proper doctests:
#

class Circle:
    
    def __init__(self, radius):
        # Define doctests for __init__ method:
        """
        >>> c1 = Circle(2.5)
        >>> c1.radius
        2.5
        """
        self.radius = radius
        
    def area(self):
        # Define doctests for area method:
        """
        >>> c1 = Circle(2.5)
        >>> c1.area()
        19.63
        """
        # Define area functionality:
        pi=math.pi
        area=pi* self.radius**2
        return round(area,2)
        
    def circumference(self):
        # Define doctests for circumference method:
        """
        >>> c1=Circle(2.5)
        >>> c1.circumference()
        15.71
        """
        area=math.pi*(self.radius*2)
        return round(area,2)
        # Define circumference functionality:
# Refer '__main__' method code which is given below if required.     
  
# if __name__ == '__main__':
           
if __name__ == '__main__':
    doctest.testmod()
    
    c2 = Circle(2.5)
    doc1 = inspect.getdoc(c2.__init__)
    doc2 = inspect.getdoc(c2.area)
    doc3 = inspect.getdoc(c2.circumference)
    
    class_count = len(re.findall(r'Circle', doc1))
    func1_count = len(re.findall(r'c1.radius', doc1))
    func1_val = len(re.findall(r'2.5', doc1))
    
    print(str(class_count), str(func1_count), str(func1_val))
    
    class_count = len(re.findall(r'Circle', doc2))
    func1_count = len(re.findall(r'c1.area', doc2))
    func1_val = len(re.findall(r'19.63', doc2)) 
                      
    print(str(class_count), str(func1_count), str(func1_val))
                      
    class_count = len(re.findall(r'Circle', doc3))
    func1_count = len(re.findall(r'c1.circumference', doc3))
    func1_val = len(re.findall(r'15.71', doc3)) 
                      
    print(str(class_count), str(func1_count), str(func1_val))
  

LAB 2 Welcome to Unit Testing using unittest in Python.

Problem 1 : Unit Testing using unittest in Python.

Solution 1: Unit Testing using unittest in Python.

#!/bin/python3


import inspect
import re
import unittest
import math
# Define class 'Circle' and its methods with proper doctests:
class Circle:
    
    def __init__(self, radius):
        # Define initialization method:
        self.radius=radius
        if (type(radius) != type(int()))  and (type(radius) != type(float())):
            raise TypeError("radius must be a number")        
        if self.radius<0 or self.radius>1000:
            raise ValueError("radius must be between 0 and 1000 inclusive")

    def area(self):
        # Define area functionality:
        pi=math.pi
        area=pi* self.radius**2
        return round(area,2)
               
    def circumference(self):
        # Define circumference functionality:
        area=math.pi*(self.radius*2)
        return round(area,2)
        
class TestCircleCreation(unittest.TestCase):

    def test_creating_circle_with_numeric_radius(self):
        # Define a circle 'c1' with radius 2.5, and check if 
        # the value of c1.radius is equal to 2.5 or not.
        c1= Circle(2.5)
        self.assertEqual(c1.radius, 2.5)      

    def test_creating_circle_with_negative_radius(self):
        # Define a circle 'c' with radius -2.5, and check 
        # if it raises a ValueError with the message
        # "radius must be between 0 and 1000 inclusive".
        with self.assertRaises(ValueError) as e:
            c= Circle(-2.5)
        message="radius must be between 0 and 1000 inclusive"        
        self.assertEqual( str(e.exception) , message)   
    
    def test_creating_circle_with_greaterthan_radius(self):
        # Define a circle 'c' with radius 1000.1, and check 
        # if it raises a ValueError with the message
        # "radius must be between 0 and 1000 inclusive". 
        with self.assertRaises(ValueError) as e:
            c=Circle(1000.1)
        message="radius must be between 0 and 1000 inclusive"          
        self.assertEqual(str(e.exception) , message)
    
    def test_creating_circle_with_nonnumeric_radius(self):
        # Define a circle 'c' with radius 'hello' and check 
        # if it raises a TypeError with the message
        # "radius must be a number". 
        with self.assertRaises(TypeError) as e:
            c=Circle("hello")
        message= "radius must be a number"
        self.assertEqual(str(e.exception) , message)
# Refer '__main__' method code which is given below if required.     
  
# if __name__ == '__main__':
           
if __name__ == '__main__':
    
    fptr = open('output.txt', 'w')    
    runner = unittest.TextTestRunner(fptr)    
    unittest.main(testRunner=runner, exit=False)    
    fptr.close()
    
    with open('output.txt') as fp:
        output_lines = fp.readlines()
    
    
    pass_count = len(re.findall(r'\.', output_lines[0]))                       
    print(str(pass_count))
                       
    doc1 = inspect.getsource(TestCircleCreation.test_creating_circle_with_numeric_radius)
    doc2 = inspect.getsource(TestCircleCreation.test_creating_circle_with_negative_radius)
    doc3 = inspect.getsource(TestCircleCreation.test_creating_circle_with_greaterthan_radius)
    doc4 = inspect.getsource(TestCircleCreation.test_creating_circle_with_nonnumeric_radius)
    
    assert1_count = len(re.findall(r'assertEqual', doc1))    
    print(str(assert1_count))
    
    assert1_count = len(re.findall(r'assertEqual', doc2))
    assert2_count = len(re.findall(r'assertRaises', doc2))    
    print(str(assert1_count), str(assert2_count))
    
    assert1_count = len(re.findall(r'assertEqual', doc3))
    assert2_count = len(re.findall(r'assertRaises', doc3))    
    print(str(assert1_count), str(assert2_count))
    
    assert1_count = len(re.findall(r'assertEqual', doc4))
    assert2_count = len(re.findall(r'assertRaises', doc4))    
    print(str(assert1_count), str(assert2_count))
  

Problem 2 : Unit Testing using unittest in Python

Solution 2: Unit Testing using unittest in Python

#!/bin/python3



import inspect
import re
import unittest
import math

class Circle:
    
    
    def __init__(self, radius):
        # Define initialization method:
        self.radius=radius
        if (type(radius)   != type(int()))  and (type(radius) != type(float())):
            raise TypeError("radius must be a number")
                
        if self.radius<0 or self.radius>1000:
            raise ValueError("radius must be between 0 and 1000 inclusive")
    
    def area(self):
        # Define area functionality:
        pi=math.pi
        area=pi* self.radius**2
        return round(area,2)
               
    def circumference(self):
        # Define circumference functionality:
        area=math.pi*(self.radius*2)
        return round(area,2)

        
class TestCircleArea(unittest.TestCase):
    
    def test_circlearea_with_random_numeric_radius(self):
        # Define a circle 'c1' with radius 2.5, and check if 
        # its area is 19.63.
        self.assertEqual(Circle(2.5).area(),19.63)
        
    def test_circlearea_with_min_radius(self):
        # Define a circle 'c2' with radius 0, and check if 
        # its area is 0.
        self.assertEqual(Circle(0).area(),0)
        
    def test_circlearea_with_max_radius(self):
        # Define a circle 'c3' with radius 1000, and check if 
        # its area is 3141592.65.        
        self.assertEqual(Circle(1000).area(),3141592.65)

# Refer '__main__' method code which is given below if required.     
  
# if __name__ == '__main__':
           
if __name__ == '__main__':
    
    fptr = open('output.txt', 'w')
    
    runner = unittest.TextTestRunner(fptr)
    
    unittest.main(testRunner=runner, exit=False)
    
    fptr.close()
    
    with open('output.txt') as fp:
        output_lines = fp.readlines()
    
    
    pass_count = [ len(re.findall(r'\.', line)) for line in output_lines if (line.startswith('.') or line.startswith('E')) and line.endswith('.\n')]
    
    pass_count = pass_count[0]
                       
    print(str(pass_count))
                       
    doc1 = inspect.getsource(TestCircleArea.test_circlearea_with_random_numeric_radius)
    doc2 = inspect.getsource(TestCircleArea.test_circlearea_with_min_radius)
    doc3 = inspect.getsource(TestCircleArea.test_circlearea_with_max_radius)
    
    assert1_count = len(re.findall(r'assertEqual', doc1))
    
    print(str(assert1_count))
    
    assert1_count = len(re.findall(r'assertEqual', doc2))
    
    print(str(assert1_count))
    
    assert1_count = len(re.findall(r'assertEqual', doc3))
    
    print(str(assert1_count))
   
    

  

Problem 3: Unit Testing using unittest in Python

Solution 3: Unit Testing using unittest in Python

#!/bin/python3

import inspect
import re
import unittest
import math

# Define class 'Circle' and its methods:
class Circle:
    
    def __init__(self, radius):
        # Define initialization method:
        self.radius=radius
        if (type(radius)   != type(int()))  and (type(radius) != type(float())):
            raise TypeError("radius must be a number")
                
        if self.radius<0 or self.radius>1000:
            raise ValueError("radius must be between 0 and 1000 inclusive")
    
    def area(self):
        # Define area functionality:
        pi=math.pi
        area=pi* self.radius**2
        return round(area,2)
               
    def circumference(self):
        # Define circumference functionality:
        area=math.pi*(self.radius*2)
        return round(area,2)
        
class TestCircleCircumference(unittest.TestCase):
    
    def test_circlecircum_with_random_numeric_radius(self):
        # Define a circle 'c1' with radius 2.5, and check if 
        # its circumference is 15.71.        
        self.assertEqual(Circle(2.5).circumference(),15.71)
        
    def test_circlecircum_with_min_radius(self):
        # Define a circle 'c2' with radius 0, and check if 
        # its circumference is 0.
        self.assertEqual(Circle(0).circumference(),0)
        
    def test_circlecircum_with_max_radius(self):
        # Define a circle 'c3' with radius 1000, and check if 
        # its circumference is 6283.19.
        self.assertEqual(Circle(1000).circumference(),6283.19)

# Refer '__main__' method code which is given below if required.     
  
# if __name__ == '__main__':
   

if __name__ == '__main__':
    
    fptr = open('output.txt', 'w')    
    runner = unittest.TextTestRunner(fptr)    
    unittest.main(testRunner=runner, exit=False)
    
    fptr.close()    
    with open('output.txt') as fp:
        output_lines = fp.readlines()
    
    
    pass_count = [ len(re.findall(r'\.', line)) for line in output_lines if (line.startswith('.') or line.startswith('E')) and line.endswith('.\n')]    
    pass_count = pass_count[0]                       
    print(str(pass_count))
                       
    doc1 = inspect.getsource(TestCircleCircumference.test_circlecircum_with_random_numeric_radius)
    doc2 = inspect.getsource(TestCircleCircumference.test_circlecircum_with_min_radius)
    doc3 = inspect.getsource(TestCircleCircumference.test_circlecircum_with_max_radius)
    
    assert1_count = len(re.findall(r'assertEqual', doc1))    
    print(str(assert1_count))
    
    assert1_count = len(re.findall(r'assertEqual', doc2))    
    print(str(assert1_count))
    
    assert1_count = len(re.findall(r'assertEqual', doc3))    
    print(str(assert1_count))
  

LAB 3: Welcome to Python Qualis - Nose Testing Framework

LAB 3: Welcome to Python Qualis - Nose Testing Framework

# mytest/test_circle.py

from proj.circle import Circle
from nose.tools import assert_raises, eq_, eq_
# Define a nose test class 'TestingCircleCreation'
class TestingCircleCreation:
    # Define a nose test method 'test_creating_circle_with_numeric_radius', which creates a circle with radius 2.5, and check if its radius value is 2.5 using eq_ method.
    def test_creating_circle_with_numeric_radius(self):
        eq_(Circle(2.5).radius,2.5)        

    # Define a nose test method 'test_creating_circle_with_negative_radius', which checks if the ValueError exception is raised with the error message "radius must be between 0 and 1000 inclusive" using eq_ method, while creating a circle of radius -2.5.
    # Hint: Use assert_raises and with.

    def test_creating_circle_with_negative_radius(self):
        with assert_raises(ValueError) as e:          
            Circle(-2.5)
        message="radius must be between 0 and 1000 inclusive"      
        eq_( str(e.exception),message)

    # Define a nose test method 'test_creating_circle_with_greaterthan_radius', which checks if the ValueError exception is raised with the error message "radius must be between 0 and 1000 inclusive" using eq_ method, while creating circle of radius 1000.1 .
    # Hint: Use assert_raises and with
    def test_creating_circle_with_greaterthan_radius(self):
        with assert_raises(ValueError) as e:
            Circle(1000.1)
        message="radius must be between 0 and 1000 inclusive"
        eq_(str(e.exception) , message)

    # Define a nose test method 'test_creating_circle_with_nonnumeric_radius', which checks if the TypeError exception is raised with the error message "radius must be a number" using eq_ method, while creating circle of radius 'hello' .
    # Hint: Use assert_raises and with.
    def test_creating_circle_with_nonnumeric_radius(self):
        with assert_raises(TypeError) as e:
            c=Circle("hello")
        message= "radius must be a number"
        eq_(str(e.exception) , message)

#Define a nose test class 'TestCircleArea'
class TestCircleArea:
    # Define a nose test method 'test_circlearea_with_random_numeric_radius', which creates a circle 'c1' with radius 2.5, and check if its computed area is 19.63 using eq_ method.
    def test_circlearea_with_random_numeric_radius(self):
        eq_(Circle(2.5).area(),19.63)        
        
    # Define a nose test method 'test_circlearea_with_min_radius', which creates a circle 'c2' with radius 0, and check if its computed area is 0 using eq_ method.
    def test_circlearea_with_min_radius(self):        
        eq_(Circle(0).area(),0)

    # Define a nose test method 'test_circlearea_with_max_radius', which creates a circle 'c3' with radius 1000, and check if its computed area is 3141592.65 using eq_ method.
    def test_circlearea_with_max_radius(self):
        eq_(Circle(1000).area(),3141592.65)

# Define a nose test class 'TestCircleCircumference'
class TestCircleCircumference:
    # Define a nose test method 'test_circlecircum_with_random_numeric_radius', which creates a circle 'c1' with radius 2.5, and check if its computed circumference is 15.71 using eq_ method.
    def test_circlecircum_with_random_numeric_radius(self):
        eq_(Circle(2.5).circumference(),15.71)

    # Define a nose test method 'test_circlecircum_with_min_radius', which creates a circle 'c2' with radius 0, and check if its computed circumference is 0 using eq_ method.
    def test_circlecircum_with_min_radius(self):
        eq_(Circle(0).circumference(),0)

    # Define a nose test method 'test_circlecircum_with_max_radius', which creates a circle 'c3' with radius 1000, and check if its computed circumference is 6283.19 using eq_ method.
    def test_circlecircum_with_max_radius(self):
        eq_(Circle(1000).circumference(),6283.19)
  

LAB 4: Welcome to Python Qualis Pytest Testing - Pytest Testing Framework

LAB 4: Welcome to Python Qualis Pytest Testing - Pytest Testing Framework

#challenge/mytest/test_inventory.py

# Kindly Note: 
# If you are getting error like this :
#__________ TestInventoryAddStock.test_add_new_stock_with_float_values failed__________   
#========================= 1 failed, 1 passed in 0.06s ==========================

# Then you just need to run this code 2 or 3 time, you may faced this error because of compiler issue.


import sys
import os
sys.path.append(os.getcwd())

from proj.inventory import MobileInventory, InsufficientException
import pytest
# Use assert statement for assert, and to check. Ex: assert 1 == 1
# Define a pytest test class **'TestingInventoryCreation'**
# Define a pytest test class **'TestingInventoryCreation'**
class TestingInventoryCreation:
    # Define a pytest test method **'test_creating_empty_inventory'**, which creates an empty inventory and checks if its 'balance_inventory' is an empty dict using assert.
    def test_creating_empty_inventory(self):
        assert MobileInventory().balance_inventory=={}

    # Define a pytest test method **'test_creating_specified_inventory'**, which checks if inventory instance with input {'iPhone Model X':100, 'Xiaomi Model Y': 1000, 'Nokia Model Z':25}.
    def test_creating_specified_inventory(self):
        
        my_dict={"iPhone Model X":100,'Xiaomi Model Y':1000,'Nokia Model Z':25}
        assert MobileInventory({"iPhone Model X":100,'Xiaomi Model Y':1000,'Nokia Model Z':25}).balance_inventory== my_dict

    def test_creating_inventory_with_list(self):
        with pytest.raises(TypeError) :
            assert "Input inventory must be a dictionary" == MobileInventory(['iPhone Model X', 'Xiaomi Model Y', 'Nokia Model Z'])


    # Define a pytest test method **'test_creating_inventory_with_numeric_keys'**, which checks if the  method raises a ValueError with the message "Mobile model name must be a string" using assert, when the dict {1:'iPhone Model X', 2:'Xiaomi Model Y', 3:'Nokia Model Z'} is passed as input.
    def test_creating_inventory_with_numeric_keys(self):
        message="Mobile model name must be a string"
        with pytest.raises(ValueError):
            assert  MobileInventory( {1:'iPhone Model X', 2:'Xiaomi Model Y', 3:'Nokia Model Z'})==message

    # Define a pytest test method **'test_creating_inventory_with_nonnumeric_values'**, which checks if the  method raises a ValueError with the message "No. of mobiles must be a positive integer" using assert, when the dict {'iPhone Model X':'100', 'Xiaomi Model Y': '1000', 'Nokia Model Z':'25'} is passed as input.
    def test_creating_inventory_with_nonnumeric_values(self):
        with pytest.raises(ValueError):
            message="No. of mobiles must be a positive integer"            
            assert message == MobileInventory({ 'iPhone Model X':'100', 'Xiaomi Model Y': '1000','Nokia Model Z':'25'})



    # Define a pytest test method **'test_creating_inventory_with_negative_value'**, which checks if the  method raises a ValueError with the message "No. of mobiles must be a positive integer" using assert, when the dict {'iPhone Model X':-45, 'Xiaomi Model Y': 200, 'Nokia Model Z':25} is passed as input.
    def test_creating_inventory_with_negative_value(self):
        with pytest.raises(ValueError):
            message="No. of mobiles must be a positive integer"
            assert message==MobileInventory({'iPhone Model X':-45, 'Xiaomi Model Y': 200, 'Nokia Model Z':25})

# Define another pytest test class **'TestInventoryAddStock'**, which tests the behavior of the **'add_stock'** method, with the following tests.
class TestInventoryAddStock:

    # Define a pytest class fixture 'setup_class', which creates an **'MobileInventory'** instance with input {'iPhone Model X':100, 'Xiaomi Model Y': 1000, 'Nokia Model Z':25} and assign it to class attribute **'inventory'**.
    @classmethod
    def setup_class(cls):
        cls.inventory=MobileInventory({'iPhone Model X':100, 'Xiaomi Model Y': 1000, 'Nokia Model Z':25} )

    # Define a pytest test method **'test_add_new_stock_as_dict'**, which adds the new stock {'iPhone Model X':50, 'Xiaomi Model Y': 2000, 'Nokia Model A':10} to the existing inventory, and update the **balance_inventory** attribute. Also, check if the updated **balance_inventory** equals {'iPhone Model X':150, 'Xiaomi Model Y': 3000, 'Nokia Model Z':25, 'Nokia Model A':10} using assert.
    def test_add_new_stock_as_dict(self):
        self.inventory.add_stock({'iPhone Model X':50, 'Xiaomi Model Y': 2000, 'Nokia Model A':10})

        assert self.inventory.balance_inventory=={'iPhone Model X':150, 'Xiaomi Model Y': 3000, 'Nokia Model Z':25, 'Nokia Model A':10} 

    # Define a pytest test method **'test_add_new_stock_as_list'**, which adds the new stock ['iPhone Model X', 'Xiaomi Model Y', 'Nokia Model Z'] to the existing inventory, and which checks if the method raises a TypeError with the message "Input stock must be a dictionary" using assert.
    def test_add_new_stock_as_list(self):
        my_dict_as_list =  ['iPhone Model X', 'Xiaomi Model Y', 'Nokia Model Z']
        message="Input stock must be a dictionary" 
        with pytest.raises(TypeError):
            assert message ==self.inventory.add_stock(my_dict_as_list)
            # MobileInventory.add_stock(self,my_dict_as_list)
        

    # Define a pytest test method **'test_add_new_stock_with_numeric_keys'**, which adds the new stock {1:'iPhone Model A', 2:'Xiaomi Model B', 3:'Nokia Model C'} to the existing inventory, and which checks if the method raises a ValueError with the message "Mobile model name must be a string" using assert.
    def test_add_new_stock_with_numeric_keys(self):
        my_dict_as_list = {1:'iPhone Model A', 2:'Xiaomi Model B', 3:'Nokia Model C'} 
        message= "Mobile model name must be a string"  
        with pytest.raises(ValueError):
            assert message ==self.inventory.add_stock(my_dict_as_list)
    # Define a pytest test method **'test_add_new_stock_with_nonnumeric_values'**, which adds the new stock {'iPhone Model A':'50', 'Xiaomi Model B':'2000', 'Nokia Model C':'25'} to the existing inventory, and which checks if the method raises a ValueError with the message "No. of mobiles must be a positive integer" using assert.
    def test_add_new_stock_with_nonnumeric_values(self):
        message= "No. of mobiles must be a positive integer"
        my_dict_as_string= {'iPhone Model A':'50', 'Xiaomi Model B':'2000', 'Nokia Model C':'25'}
        with pytest.raises(ValueError):
            assert message==MobileInventory.add_stock(self,my_dict_as_string)

    # Define a pytest test method **'test_add_new_stock_with_float_values'**, which adds the new stock {'iPhone Model A':50.5, 'Xiaomi Model B':2000.3, 'Nokia Model C':25} to the existing inventory, and which checks if the method raises a ValueError with the message "No. of mobiles must be a positive integer" using assert.
    def test_add_new_stock_with_float_values(self):
        message= "No. of mobiles must be a positive integer"
        my_dict_as_float = {'iPhone Model A':50.5, 'Xiaomi Model B':2000.3, 'Nokia Model C':25} 
        with pytest.raises(ValueError):
            assert message==MobileInventory.add_stock(self,my_dict_as_float)
        


# Define another pytest test class **'TestInventorySellStock'**, which tests the behavior of the **'sell_stock'** method, with the following tests.
class TestInventorySellStock:
    stock_as_list_message="Requested stock must be a dictionary" 
    stock_as_numeric_key_message="Mobile model name must be a string" 
    stock_as_float_values_message= "No. of mobiles must be a positive integer" 
    stock_as_non_numeric_message= "No. of mobiles must be a positive integer" 
    # Define a pytest class fixture 'setup_class', which creates an **'MobileInventory'** instance with the input {'iPhone Model A':50, 'Xiaomi Model B': 2000, 'Nokia Model C':10, 'Sony Model D':1}, and assign it to the class attribute **'inventory'**.
    @classmethod
    def setup_class(cls):
        my_dict= {'iPhone Model A':50, 'Xiaomi Model B': 2000, 'Nokia Model C':10, 'Sony Model D':1}
        cls.inventory=MobileInventory(my_dict)

    # Define a pytest test method **'test_sell_stock_as_dict'**, which sells the requested stock {'iPhone Model A':2, 'Xiaomi Model B':20, 'Sony Model D':1} from the existing inventory, and update the **balance_inventory** attribute. Also check if the updated **balance_inventory** equals {'iPhone Model A':48, 'Xiaomi Model B': 1980, 'Nokia Model C':10, 'Sony Model D':0} using assert.
    def test_sell_stock_as_dict(self):
        my_dict_as_sell_stock= {'iPhone Model A':2, 'Xiaomi Model B':20, 'Sony Model D':1} 
        my_dict_balance= {'iPhone Model A':48, 'Xiaomi Model B': 1980, 'Nokia Model C':10, 'Sony Model D':0}
        self.inventory.sell_stock(my_dict_as_sell_stock)
        assert my_dict_balance ==  self.inventory.balance_inventory
    
    # Define a pytest test method **'test_sell_stock_as_list'**, which tries selling the requested stock ['iPhone Model A', 'Xiaomi Model B', 'Nokia Model C'] from the existing inventory, and which checks if the method raises a TypeError with the message "Requested stock must be a dictionary" using assert.
    def test_sell_stock_as_list(self):
        my_dict_as_list= ['iPhone Model A', 'Xiaomi Model B', 'Nokia Model C']
        with pytest.raises(TypeError):
            assert TestInventorySellStock.stock_as_list_message== MobileInventory.sell_stock(self,my_dict_as_list)

    # Define a pytest test method **'test_sell_stock_with_numeric_keys'**, which tries selling the requested stock {1:'iPhone Model A', 2:'Xiaomi Model B', 3:'Nokia Model C'} from the existing inventory, and which checks if the method raises ValueError with the message "Mobile model name must be a string" using assert.
    def test_sell_stock_with_numeric_keys(self):
        my_dict_as_int = {1:'iPhone Model A', 2:'Xiaomi Model B', 3:'Nokia Model C'}
        with pytest.raises(ValueError):
            assert TestInventorySellStock.stock_as_numeric_key_message == self.inventory.sell_stock(my_dict_as_int)

    # Define a pytest test method **'test_sell_stock_with_nonnumeric_values'**, which tries selling the requested stock {'iPhone Model A':'2', 'Xiaomi Model B':'3', 'Nokia Model C':'4'} from the existing inventory, and which checks if the method raises a ValueError with the message "No. of mobiles must be a positive integer" using assert.
    def test_sell_stock_with_nonnumeric_values(self):
        my_dict_as_str =  {'iPhone Model A':'2', 'Xiaomi Model B':'3', 'Nokia Model C':'4'}
        with pytest.raises(ValueError):
            assert TestInventorySellStock.stock_as_non_numeric_message == self.inventory.sell_stock(my_dict_as_str)

    # Define a pytest test method **'test_sell_stock_with_float_values'**, which tries selling the requested stock {'iPhone Model A':2.5, 'Xiaomi Model B':3.1, 'Nokia Model C':4} from the existing inventory, and which checks if the method raises a ValueError with the message "No. of mobiles must be a positive integer" using assert.
    def test_sell_stock_with_float_values(self):
        my_dict_as_float={'iPhone Model A':2.5, 'Xiaomi Model B':3.1, 'Nokia Model C':4}
        with pytest.raises(ValueError):
            assert TestInventorySellStock.stock_as_float_values_message == self.inventory.sell_stock(my_dict_as_float)

    # Define a pytest test method **'test_sell_stock_of_Nonexisting_model'**, which tries selling the requested stock {'iPhone Model B':2, 'Xiaomi Model B':5} from the existing inventory, and which checks if the method raises an InsufficientException with the message "No Stock. New Model Request" using assert.
    def test_sell_stock_of_Nonexisting_model(self):
        my_dict_Nonexisting = {'iPhone Model B':2, 'Xiaomi Model B':5} 
        message= "No Stock. New Model Request" 
        with pytest.raises(InsufficientException):
            assert message == self.inventory.sell_stock(my_dict_Nonexisting)

    # Define a pytest test method **'test_sell_stock_of_insufficient_stock'**, which tries selling the requested stock {'iPhone Model A':2, 'Xiaomi Model B':5, 'Nokia Model C': 15} from the existing inventory, and which checks if the method raises an InsufficientException with the message "Insufficient Stock" using assert.
    def test_sell_stock_of_insufficient_stock(self):
        my_dict_insufficient={'iPhone Model A':2, 'Xiaomi Model B':5, 'Nokia Model C': 15}
        message= "Insufficient Stock"
        with pytest.raises(InsufficientException):
            assert message == MobileInventory.sell_stock(self.inventory, my_dict_insufficient)

  
Toipc Covered:

Python Qualis hands-on doctest Fresco play

Python Qualis hands-on Unittest Fresco play

Python Qualis hands-on Nose Testing Fresco play

Python Qualis hands-on Pytest Fresco play

About the author

D Shwari
I'm a professor at National University's Department of Computer Science. My main streams are data science and data analysis. Project management for many computer science-related sectors. Next working project on Al with deep Learning.....

3 comments

  1. Anonymous
    Getting error for this LAB 3: Welcome to Python Qualis - Nose Testing Framework.
    1. Anonymous
      Hi, what error are you getting? Would you be able to share the error info.
  2. Anonymous
    #Answer LAB3
    import math
    import pytest
    from proj.circle import Circle

    class TestingCircleCreation:
    def test_creating_circle_with_numeric_radius(self):
    """Test creating a circle with a valid numeric radius."""
    c1 = Circle(2.5)
    assert c1.radius == 2.5

    def test_creating_circle_with_negative_radius(self):
    """Test creating a circle with a negative radius and raise ValueError."""
    with pytest.raises(ValueError) as exc:
    Circle(-2.5)
    assert str(exc.value) == "radius must be between 0 and 1000 inclusive"

    def test_creating_circle_with_greaterthan_radius(self):
    """Test creating a circle with a radius > 1000 and raise ValueError."""
    with pytest.raises(ValueError) as exc:
    Circle(1000.1)
    assert str(exc.value) == "radius must be between 0 and 1000 inclusive"

    def test_creating_circle_with_nonnumeric_radius(self):
    """Test creating a circle with a non-numeric radius and raise TypeError."""
    with pytest.raises(TypeError) as exc:
    Circle('hello')
    assert str(exc.value) == "radius must be a number"


    class TestCircleArea:
    def test_circlearea_with_random_numeric_radius(self):
    """Test circle area with a random numeric radius."""
    c1 = Circle(2.5)
    assert round(c1.area(), 2) == 19.63

    def test_circlearea_with_min_radius(self):
    """Test circle area with minimum radius (0)."""
    c2 = Circle(0)
    assert c2.area() == 0

    def test_circlearea_with_max_radius(self):
    """Test circle area with maximum radius (1000)."""
    c3 = Circle(1000)
    assert round(c3.area(), 2) == 3141592.65


    class TestCircleCircumference:
    def test_circlecircum_with_random_numeric_radius(self):
    """Test circle circumference with a random numeric radius."""
    c1 = Circle(2.5)
    assert round(c1.circumference(), 2) == 15.71

    def test_circlecircum_with_min_radius(self):
    """Test circle circumference with minimum radius (0)."""
    c2 = Circle(0)
    assert c2.circumference() == 0

    def test_circlecircum_with_max_radius(self):
    """Test circle circumference with maximum radius (1000)."""
    c3 = Circle(1000)
    assert round(c3.circumference(), 2) == 6283.19