def test_compute_weighted_question_filter_hybrid_min_does_not_contain_item(self):
        # Arrange
        weighted_algorithm = WeightScoringAlgorithm()

        # Act
        result = weighted_algorithm.compute_weighted_question_filter(HYBRID_WEIGHT_MIN, False)

        # Assert
        self.assertTrue(result)
    def test_compute_weighted_question_filter_working(self):
        # Arrange
        weighted_algorithm = WeightScoringAlgorithm()

        # Act
        result = weighted_algorithm.compute_weighted_question_filter(0, True)

        # Assert
        self.assertTrue(result)
    def test_compute_weighted_question_score_zero_scale_factor_does_contain_item(self):
        # Arrange
        weighted_algorithm = WeightScoringAlgorithm()
        user_scale_factor = 0
        does_contain_item = True

        # Act
        result = weighted_algorithm.compute_weighted_question_score(user_scale_factor, does_contain_item)

        # Assert
        self.assertEqual(0, result)
    def test_compute_weighted_question_score_positive_scale_factor_does_contain_item(self):
        # Arrange
        weighted_algorithm = WeightScoringAlgorithm()
        user_scale_factor = 4
        does_contain_item = True

        # Act
        result = weighted_algorithm.compute_weighted_question_score(user_scale_factor, does_contain_item)

        # Assert
        self.assertEqual(1 * user_scale_factor * HYBRID_QUESTION_WEIGHT, result)
    def test_wants_neither_in_unit_and_building(self):
        """
        Tests that if a user says they don't want in building or in unit then
            even if the home has it, it doesn't affect the score
        """
        # Arrange
        survey = RentingSurveyModel.create_survey(self.user.userProfile, wants_laundry_in_building=False, wants_laundry_in_unit=False)
        weighted_algorithm = WeightScoringAlgorithm()

        home = self.create_home(self.home_type, laundry_in_unit=True, laundry_in_building=True)

        # Act
        weighted_algorithm.handle_laundry_weight_question(survey, home)

        # Assert
        self.assertEqual(home.accumulated_points, 0)
        self.assertEqual(home.total_possible_points, 0)
        self.assertFalse(home.eliminated)
    def test_wants_in_unit_need(self):
        """
        Tests that if the user needs in building, then if the home has either in unit or in building
            then it is scored properly
        """
        # Arrange
        in_unit_weight = HYBRID_WEIGHT_MAX
        in_building_weight = 0
        survey = RentingSurveyModel.create_survey(self.user.userProfile, wants_laundry_in_building=False,
                                    wants_laundry_in_unit=True,
                                    laundry_in_unit_weight=in_unit_weight,
                                    laundry_in_building_weight=in_building_weight,
                                    )
        weighted_algorithm = WeightScoringAlgorithm()

        # Create homes
        home = self.create_home(self.home_type, laundry_in_unit=False, laundry_in_building=False)
        home1 = self.create_home(self.home_type, laundry_in_unit=True, laundry_in_building=False)
        home2 = self.create_home(self.home_type, laundry_in_unit=False, laundry_in_building=True)
        home3 = self.create_home(self.home_type, laundry_in_unit=True, laundry_in_building=True)

        # Act
        weighted_algorithm.handle_laundry_weight_question(survey, home)
        weighted_algorithm.handle_laundry_weight_question(survey, home1)
        weighted_algorithm.handle_laundry_weight_question(survey, home2)
        weighted_algorithm.handle_laundry_weight_question(survey, home3)

        # Assert
        self.assertEqual(home.accumulated_points, 0)
        self.assertEqual(home.total_possible_points, abs(in_unit_weight) * weighted_algorithm.hybrid_question_weight)
        self.assertFalse(home.eliminated)

        self.assertEqual(home1.accumulated_points, weighted_algorithm.compute_weighted_question_score(in_unit_weight, home1.home.laundry_in_unit))
        self.assertEqual(home1.total_possible_points, abs(in_unit_weight) * weighted_algorithm.hybrid_question_weight)
        self.assertFalse(home1.eliminated)

        self.assertEqual(home2.accumulated_points, 0)
        self.assertEqual(home2.total_possible_points, abs(in_unit_weight) * weighted_algorithm.hybrid_question_weight)
        self.assertFalse(home2.eliminated)

        self.assertEqual(home3.accumulated_points, weighted_algorithm.compute_weighted_question_score(in_unit_weight, home3.home.laundry_in_unit))
        self.assertEqual(home3.total_possible_points, abs(in_unit_weight) * weighted_algorithm.hybrid_question_weight)
        self.assertFalse(home3.eliminated)