2023 the huggingface team licensed under the apache license version 2 0 the license you may not use this file except in compliance with the license you may obtain a copy of the license at http www apache orglicenseslicense2 0 unless required by applicable law or agreed to in writing software distributed under the license is distributed on an as is basis without warranties or conditions of any kind either express or implied see the license for the specific language governing permissions and limitations under the license defaults to last layer if both are none out indices set to match out features out features set to match out indices out features selected from negative indices stage names must be set out features must be a list out features must be a subset of stage names out indices must be a list or tuple out indices must be a subset of stage names out features and out indices must be the same length out features should match out indices out features and out indices should be in order check passes with valid inputs check that the output features and indices are set correctly check out features and indices are updated correctly 2023 the huggingface team licensed under the apache license version 2 0 the license you may not use this file except in compliance with the license you may obtain a copy of the license at http www apache org licenses license 2 0 unless required by applicable law or agreed to in writing software distributed under the license is distributed on an as is basis without warranties or conditions of any kind either express or implied see the license for the specific language governing permissions and limitations under the license defaults to last layer if both are none out indices set to match out features out features set to match out indices out features selected from negative indices stage names must be set out features must be a list out features must be a subset of stage names out indices must be a list or tuple out indices must be a subset of stage names out features and out indices must be the same length out features should match out indices out features and out indices should be in order check passes with valid inputs check that the output features and indices are set correctly check out features and indices are updated correctly
import unittest

from transformers.utils.backbone_utils import (
    BackboneMixin,
    get_aligned_output_features_output_indices,
    verify_out_features_out_indices,
)


class BackboneUtilsTester(unittest.TestCase):
    def test_get_aligned_output_features_output_indices(self):
        stage_names = ["a", "b", "c"]

        
        out_features, out_indices = get_aligned_output_features_output_indices(None, None, stage_names)
        self.assertEqual(out_features, ["c"])
        self.assertEqual(out_indices, [2])

        
        out_features, out_indices = get_aligned_output_features_output_indices(["a", "c"], None, stage_names)
        self.assertEqual(out_features, ["a", "c"])
        self.assertEqual(out_indices, [0, 2])

        
        out_features, out_indices = get_aligned_output_features_output_indices(None, [0, 2], stage_names)
        self.assertEqual(out_features, ["a", "c"])
        self.assertEqual(out_indices, [0, 2])

        
        out_features, out_indices = get_aligned_output_features_output_indices(None, [-3, -1], stage_names)
        self.assertEqual(out_features, ["a", "c"])
        self.assertEqual(out_indices, [-3, -1])

    def test_verify_out_features_out_indices(self):
        
        with self.assertRaises(ValueError):
            verify_out_features_out_indices(["a", "b"], (0, 1), None)

        
        with self.assertRaises(ValueError):
            verify_out_features_out_indices(("a", "b"), (0, 1), ["a", "b"])

        
        with self.assertRaises(ValueError):
            verify_out_features_out_indices(["a", "b"], (0, 1), ["a"])

        
        with self.assertRaises(ValueError):
            verify_out_features_out_indices(None, 0, ["a", "b"])

        
        with self.assertRaises(ValueError):
            verify_out_features_out_indices(None, (0, 1), ["a"])

        
        with self.assertRaises(ValueError):
            verify_out_features_out_indices(["a", "b"], (0,), ["a", "b", "c"])

        
        with self.assertRaises(ValueError):
            verify_out_features_out_indices(["a", "b"], (0, 2), ["a", "b", "c"])

        
        with self.assertRaises(ValueError):
            verify_out_features_out_indices(["b", "a"], (0, 1), ["a", "b"])

        
        verify_out_features_out_indices(["a", "b", "d"], (0, 1, -1), ["a", "b", "c", "d"])

    def test_backbone_mixin(self):
        backbone = BackboneMixin()

        backbone.stage_names = ["a", "b", "c"]
        backbone._out_features = ["a", "c"]
        backbone._out_indices = [0, 2]

        
        self.assertEqual(backbone.out_features, ["a", "c"])
        self.assertEqual(backbone.out_indices, [0, 2])

        
        backbone.out_features = ["a", "b"]
        self.assertEqual(backbone.out_features, ["a", "b"])
        self.assertEqual(backbone.out_indices, [0, 1])

        backbone.out_indices = [-3, -1]
        self.assertEqual(backbone.out_features, ["a", "c"])
        self.assertEqual(backbone.out_indices, [-3, -1])