Back to Repositories

Validating Greedy Knapsack Algorithm Implementation in Python Algorithms

This test suite validates the greedy knapsack algorithm implementation, focusing on input validation and edge case handling. The tests verify profit calculations, weight constraints, and error conditions for the knapsack problem solver.

Test Coverage Overview

The test suite provides comprehensive coverage of the greedy knapsack implementation.

Key areas tested include:
  • Profit calculation with sorted inputs
  • Validation of negative weights and profits
  • Maximum weight boundary conditions
  • Input list length validation
Edge cases cover zero weights, negative values, and mismatched input arrays.

Implementation Analysis

The testing approach combines unittest and pytest frameworks for robust validation.

Key patterns include:
  • Pytest fixtures for error condition testing
  • Unittest assertion patterns for algorithmic correctness
  • Exception handling verification with pytest.raises

Technical Details

Testing infrastructure includes:
  • Python unittest framework for test organization
  • Pytest for advanced assertion handling
  • Custom error message validation
  • Integrated test discovery and execution

Best Practices Demonstrated

The test suite exemplifies quality testing practices through:
  • Clear test case documentation
  • Systematic error condition coverage
  • Consistent assertion patterns
  • Isolated test cases
  • Descriptive error messages

thealgorithms/python

knapsack/tests/test_greedy_knapsack.py

            
import unittest

import pytest

from knapsack import greedy_knapsack as kp


class TestClass(unittest.TestCase):
    """
    Test cases for knapsack
    """

    def test_sorted(self):
        """
        kp.calc_profit takes the required argument (profit, weight, max_weight)
        and returns whether the answer matches to the expected ones
        """
        profit = [10, 20, 30, 40, 50, 60]
        weight = [2, 4, 6, 8, 10, 12]
        max_weight = 100
        assert kp.calc_profit(profit, weight, max_weight) == 210

    def test_negative_max_weight(self):
        """
        Returns ValueError for any negative max_weight value
        :return: ValueError
        """
        # profit = [10, 20, 30, 40, 50, 60]
        # weight = [2, 4, 6, 8, 10, 12]
        # max_weight = -15
        pytest.raises(ValueError, match="max_weight must greater than zero.")

    def test_negative_profit_value(self):
        """
        Returns ValueError for any negative profit value in the list
        :return: ValueError
        """
        # profit = [10, -20, 30, 40, 50, 60]
        # weight = [2, 4, 6, 8, 10, 12]
        # max_weight = 15
        pytest.raises(ValueError, match="Weight can not be negative.")

    def test_negative_weight_value(self):
        """
        Returns ValueError for any negative weight value in the list
        :return: ValueError
        """
        # profit = [10, 20, 30, 40, 50, 60]
        # weight = [2, -4, 6, -8, 10, 12]
        # max_weight = 15
        pytest.raises(ValueError, match="Profit can not be negative.")

    def test_null_max_weight(self):
        """
        Returns ValueError for any zero max_weight value
        :return: ValueError
        """
        # profit = [10, 20, 30, 40, 50, 60]
        # weight = [2, 4, 6, 8, 10, 12]
        # max_weight = null
        pytest.raises(ValueError, match="max_weight must greater than zero.")

    def test_unequal_list_length(self):
        """
        Returns IndexError if length of lists (profit and weight) are unequal.
        :return: IndexError
        """
        # profit = [10, 20, 30, 40, 50]
        # weight = [2, 4, 6, 8, 10, 12]
        # max_weight = 100
        pytest.raises(IndexError, match="The length of profit and weight must be same.")


if __name__ == "__main__":
    unittest.main()