





'''simple docstring'''




from __future__ import annotations

import os
import tempfile
import unittest

from transformers import ConvBertConfig, is_tf_available
from transformers.testing_utils import require_tf, slow

from ...test_configuration_common import ConfigTester
from ...test_modeling_tf_common import TFModelTesterMixin, ids_tensor, random_attention_mask
from ...test_pipeline_mixin import PipelineTesterMixin


if is_tf_available():
  import tensorflow as tf

  from transformers import (
      TFConvBertForMaskedLM,
      TFConvBertForMultipleChoice,
      TFConvBertForQuestionAnswering,
      TFConvBertForSequenceClassification,
      TFConvBertForTokenClassification,
      TFConvBertModel,
  )


class 					SCREAMING_SNAKE_CASE       :


     def __init__(		self		,      _UpperCAmelCase		,      _UpperCAmelCase=13		,      _UpperCAmelCase=7		,      _UpperCAmelCase=True		,      _UpperCAmelCase=True		,      _UpperCAmelCase=True		,      _UpperCAmelCase=True		,      _UpperCAmelCase=99		,      _UpperCAmelCase=32		,      _UpperCAmelCase=2		,      _UpperCAmelCase=4		,      _UpperCAmelCase=37		,      _UpperCAmelCase="gelu"		,      _UpperCAmelCase=0.1		,      _UpperCAmelCase=0.1		,      _UpperCAmelCase=512		,      _UpperCAmelCase=16		,      _UpperCAmelCase=2		,      _UpperCAmelCase=0.02		,      _UpperCAmelCase=3		,      _UpperCAmelCase=4		,      _UpperCAmelCase=None		,      ):

          '''simple docstring'''






          __A		:					Optional[int]						=			parent
          __A		:					str						=			13
          __A		:					List[Any]						=			7
          __A		:					List[str]						=			True
          __A		:					str						=			True
          __A		:					Optional[Any]						=			True
          __A		:					int						=			True
          __A		:					Dict						=			99
          __A		:					Dict						=			384
          __A		:					Any						=			2
          __A		:					int						=			4
          __A		:					Optional[Any]						=			37
          __A		:					Optional[int]						=			'gelu'
          __A		:					Dict						=			0.1
          __A		:					Optional[int]						=			0.1
          __A		:					Any						=			512
          __A		:					int						=			16
          __A		:					List[str]						=			2
          __A		:					str						=			0.02
          __A		:					Any						=			3
          __A		:					str						=			4
          __A		:					Union[str, Any]						=			128
          __A		:					int						=			2
          __A		:					List[Any]						=			9
          __A		:					List[Any]						=			1
          __A		:					List[Any]						=			None


     def 				SCREAMING_SNAKE_CASE    (		self):

          '''simple docstring'''






          __A		:					Union[str, Any]						=			ids_tensor([self.batch_size, self.seq_length]		,      self.vocab_size)

          __A		:					str						=			None
          if self.use_input_mask:
               __A		:					List[Any]						=			random_attention_mask([self.batch_size, self.seq_length])

          __A		:					Optional[Any]						=			None
          if self.use_token_type_ids:
               __A		:					Optional[Any]						=			ids_tensor([self.batch_size, self.seq_length]		,      self.type_vocab_size)

          __A		:					Optional[int]						=			None
          __A		:					List[str]						=			None
          __A		:					Dict						=			None
          if self.use_labels:
               __A		:					Dict						=			ids_tensor([self.batch_size]		,      self.type_sequence_label_size)
               __A		:					List[Any]						=			ids_tensor([self.batch_size, self.seq_length]		,      self.num_labels)
               __A		:					str						=			ids_tensor([self.batch_size]		,      self.num_choices)

          __A		:					List[Any]						=			ConvBertConfig(
              vocab_size=self.vocab_size		,      hidden_size=self.hidden_size		,      num_hidden_layers=self.num_hidden_layers		,      num_attention_heads=self.num_attention_heads		,      intermediate_size=self.intermediate_size		,      hidden_act=self.hidden_act		,      hidden_dropout_prob=self.hidden_dropout_prob		,      attention_probs_dropout_prob=self.attention_probs_dropout_prob		,      max_position_embeddings=self.max_position_embeddings		,      type_vocab_size=self.type_vocab_size		,      initializer_range=self.initializer_range		,      return_dict=_UpperCAmelCase		,      )

          return config, input_ids, token_type_ids, input_mask, sequence_labels, token_labels, choice_labels


     def 				SCREAMING_SNAKE_CASE    (		self		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase):

          '''simple docstring'''






          __A		:					int						=			TFConvBertModel(config=_UpperCAmelCase)
          __A		:					Optional[Any]						=			{'input_ids': input_ids, 'attention_mask': input_mask, 'token_type_ids': token_type_ids}

          __A		:					Tuple						=			[input_ids, input_mask]
          __A		:					Any						=			model(_UpperCAmelCase)

          __A		:					Dict						=			model(_UpperCAmelCase)

          self.parent.assertEqual(result.last_hidden_state.shape		,      (self.batch_size, self.seq_length, self.hidden_size))


     def 				SCREAMING_SNAKE_CASE    (		self		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase):

          '''simple docstring'''






          __A		:					str						=			TFConvBertForMaskedLM(config=_UpperCAmelCase)
          __A		:					str						=			{
              'input_ids': input_ids,
              'attention_mask': input_mask,
              'token_type_ids': token_type_ids,
          }
          __A		:					str						=			model(_UpperCAmelCase)
          self.parent.assertEqual(result.logits.shape		,      (self.batch_size, self.seq_length, self.vocab_size))


     def 				SCREAMING_SNAKE_CASE    (		self		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase):

          '''simple docstring'''






          __A		:					Optional[int]						=			self.num_labels
          __A		:					Any						=			TFConvBertForSequenceClassification(config=_UpperCAmelCase)
          __A		:					Optional[Any]						=			{
              'input_ids': input_ids,
              'attention_mask': input_mask,
              'token_type_ids': token_type_ids,
          }

          __A		:					Dict						=			model(_UpperCAmelCase)
          self.parent.assertEqual(result.logits.shape		,      (self.batch_size, self.num_labels))


     def 				SCREAMING_SNAKE_CASE    (		self		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase):

          '''simple docstring'''






          __A		:					Tuple						=			self.num_choices
          __A		:					List[str]						=			TFConvBertForMultipleChoice(config=_UpperCAmelCase)
          __A		:					int						=			tf.tile(tf.expand_dims(_UpperCAmelCase		,      1)		,      (1, self.num_choices, 1))
          __A		:					Optional[Any]						=			tf.tile(tf.expand_dims(_UpperCAmelCase		,      1)		,      (1, self.num_choices, 1))
          __A		:					List[Any]						=			tf.tile(tf.expand_dims(_UpperCAmelCase		,      1)		,      (1, self.num_choices, 1))
          __A		:					int						=			{
              'input_ids': multiple_choice_inputs_ids,
              'attention_mask': multiple_choice_input_mask,
              'token_type_ids': multiple_choice_token_type_ids,
          }
          __A		:					Optional[Any]						=			model(_UpperCAmelCase)
          self.parent.assertEqual(result.logits.shape		,      (self.batch_size, self.num_choices))


     def 				SCREAMING_SNAKE_CASE    (		self		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase):

          '''simple docstring'''






          __A		:					List[Any]						=			self.num_labels
          __A		:					List[Any]						=			TFConvBertForTokenClassification(config=_UpperCAmelCase)
          __A		:					str						=			{
              'input_ids': input_ids,
              'attention_mask': input_mask,
              'token_type_ids': token_type_ids,
          }
          __A		:					int						=			model(_UpperCAmelCase)
          self.parent.assertEqual(result.logits.shape		,      (self.batch_size, self.seq_length, self.num_labels))


     def 				SCREAMING_SNAKE_CASE    (		self		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase		,      _UpperCAmelCase):

          '''simple docstring'''






          __A		:					Optional[Any]						=			TFConvBertForQuestionAnswering(config=_UpperCAmelCase)
          __A		:					Any						=			{
              'input_ids': input_ids,
              'attention_mask': input_mask,
              'token_type_ids': token_type_ids,
          }

          __A		:					Union[str, Any]						=			model(_UpperCAmelCase)
          self.parent.assertEqual(result.start_logits.shape		,      (self.batch_size, self.seq_length))
          self.parent.assertEqual(result.end_logits.shape		,      (self.batch_size, self.seq_length))


     def 				SCREAMING_SNAKE_CASE    (		self):

          '''simple docstring'''






          __A		:					Optional[int]						=			self.prepare_config_and_inputs()
          (
              (
              __A
          )					,(
              __A
          )					,(
              __A
          )					,(
              __A
          )					,(
              __A
          )					,(
              __A
          )					,(
              __A
          )					,
          )		:					Union[str, Any]						=			config_and_inputs
          __A		:					List[str]						=			{'input_ids': input_ids, 'token_type_ids': token_type_ids, 'attention_mask': input_mask}
          return config, inputs_dict




@require_tf
class 					SCREAMING_SNAKE_CASE       (a__   ,						a__   ,						unittest.TestCase				):
     lowerCAmelCase						     =			(
         (
             TFConvBertModel,
             TFConvBertForMaskedLM,
             TFConvBertForQuestionAnswering,
             TFConvBertForSequenceClassification,
             TFConvBertForTokenClassification,
             TFConvBertForMultipleChoice,
         )
         if is_tf_available()
         else ()
     )
     lowerCAmelCase						     =			(
         {
             '''feature-extraction''': TFConvBertModel,
             '''fill-mask''': TFConvBertForMaskedLM,
             '''question-answering''': TFConvBertForQuestionAnswering,
             '''text-classification''': TFConvBertForSequenceClassification,
             '''token-classification''': TFConvBertForTokenClassification,
             '''zero-shot''': TFConvBertForSequenceClassification,
         }
         if is_tf_available()
         else {}
     )
     lowerCAmelCase						     =			False
     lowerCAmelCase						     =			False
     lowerCAmelCase						     =			False


     def 				SCREAMING_SNAKE_CASE    (		self):

          '''simple docstring'''






          __A		:					int						=			TFConvBertModelTester(self)
          __A		:					str						=			ConfigTester(self		,      config_class=_UpperCAmelCase		,      hidden_size=37)


     def 				SCREAMING_SNAKE_CASE    (		self):

          '''simple docstring'''






          self.config_tester.run_common_tests()


     def 				SCREAMING_SNAKE_CASE    (		self):

          '''simple docstring'''






          __A		:					Tuple						=			self.model_tester.prepare_config_and_inputs()
          self.model_tester.create_and_check_model(*_UpperCAmelCase)


     def 				SCREAMING_SNAKE_CASE    (		self):

          '''simple docstring'''






          __A		:					str						=			self.model_tester.prepare_config_and_inputs()
          self.model_tester.create_and_check_for_masked_lm(*_UpperCAmelCase)


     def 				SCREAMING_SNAKE_CASE    (		self):

          '''simple docstring'''






          __A		:					Optional[Any]						=			self.model_tester.prepare_config_and_inputs()
          self.model_tester.create_and_check_for_multiple_choice(*_UpperCAmelCase)


     def 				SCREAMING_SNAKE_CASE    (		self):

          '''simple docstring'''






          __A		:					List[Any]						=			self.model_tester.prepare_config_and_inputs()
          self.model_tester.create_and_check_for_question_answering(*_UpperCAmelCase)


     def 				SCREAMING_SNAKE_CASE    (		self):

          '''simple docstring'''






          __A		:					int						=			self.model_tester.prepare_config_and_inputs()
          self.model_tester.create_and_check_for_sequence_classification(*_UpperCAmelCase)


     def 				SCREAMING_SNAKE_CASE    (		self):

          '''simple docstring'''






          __A		:					int						=			self.model_tester.prepare_config_and_inputs()
          self.model_tester.create_and_check_for_token_classification(*_UpperCAmelCase)


     @slow
     def 				SCREAMING_SNAKE_CASE    (		self):

          '''simple docstring'''






          __A					,__A		:					Union[str, Any]						=			self.model_tester.prepare_config_and_inputs_for_common()
          __A		:					List[str]						=			True
          __A		:					List[str]						=			True

          if hasattr(_UpperCAmelCase		,      'use_cache'):
               __A		:					List[Any]						=			True

          __A		:					str						=			getattr(self.model_tester		,      'encoder_seq_length'		,      self.model_tester.seq_length)
          __A		:					Union[str, Any]						=			getattr(self.model_tester		,      'key_length'		,      _UpperCAmelCase)

          for model_class in self.all_model_classes:
               __A		:					List[str]						=			self._prepare_for_class(_UpperCAmelCase		,      _UpperCAmelCase)
               __A		:					Optional[int]						=			model_class(_UpperCAmelCase)
               __A		:					Optional[Any]						=			len(model(_UpperCAmelCase))

               with tempfile.TemporaryDirectory() as tmpdirname:
                    model.save_pretrained(_UpperCAmelCase		,      saved_model=_UpperCAmelCase)
                    __A		:					Union[str, Any]						=			os.path.join(_UpperCAmelCase		,      'saved_model'		,      '1')
                    __A		:					Tuple						=			tf.keras.models.load_model(_UpperCAmelCase)
                    __A		:					str						=			model(_UpperCAmelCase)

                    if self.is_encoder_decoder:
                         __A		:					Optional[int]						=			outputs['encoder_hidden_states']
                         __A		:					str						=			outputs['encoder_attentions']
                    else:
                         __A		:					List[Any]						=			outputs['hidden_states']
                         __A		:					Optional[Any]						=			outputs['attentions']

                    self.assertEqual(len(_UpperCAmelCase)		,      _UpperCAmelCase)

                    __A		:					str						=			getattr(
                        self.model_tester		,      'expected_num_hidden_layers'		,      self.model_tester.num_hidden_layers + 1)

                    self.assertEqual(len(_UpperCAmelCase)		,      _UpperCAmelCase)
                    self.assertListEqual(
                        list(output_hidden_states[0].shape[-2:])		,      [self.model_tester.seq_length, self.model_tester.hidden_size]		,      )

                    self.assertEqual(len(_UpperCAmelCase)		,      self.model_tester.num_hidden_layers)
                    self.assertListEqual(
                        list(output_attentions[0].shape[-3:])		,      [self.model_tester.num_attention_heads / 2, encoder_seq_length, encoder_key_length]		,      )


     @slow
     def 				SCREAMING_SNAKE_CASE    (		self):

          '''simple docstring'''






          __A		:					Dict						=			TFConvBertModel.from_pretrained('YituTech/conv-bert-base')
          self.assertIsNotNone(_UpperCAmelCase)


     def 				SCREAMING_SNAKE_CASE    (		self):

          '''simple docstring'''






          __A					,__A		:					Dict						=			self.model_tester.prepare_config_and_inputs_for_common()
          __A		:					Any						=			True
          __A		:					str						=			getattr(self.model_tester		,      'decoder_seq_length'		,      self.model_tester.seq_length)
          __A		:					Any						=			getattr(self.model_tester		,      'encoder_seq_length'		,      self.model_tester.seq_length)
          __A		:					int						=			getattr(self.model_tester		,      'key_length'		,      _UpperCAmelCase)
          __A		:					Tuple						=			getattr(self.model_tester		,      'key_length'		,      _UpperCAmelCase)

          def check_decoder_attentions_output(_UpperCAmelCase):
               __A		:					List[str]						=			len(_UpperCAmelCase)
               self.assertEqual(out_len % 2		,      0)
               __A		:					Any						=			outputs.decoder_attentions
               self.assertEqual(len(_UpperCAmelCase)		,      self.model_tester.num_hidden_layers)
               self.assertListEqual(
                   list(decoder_attentions[0].shape[-3:])		,      [self.model_tester.num_attention_heads / 2, decoder_seq_length, decoder_key_length]		,      )

          def check_encoder_attentions_output(_UpperCAmelCase):
               __A		:					str						=			[
                   t.numpy() for t in (outputs.encoder_attentions if config.is_encoder_decoder else outputs.attentions)
               ]
               self.assertEqual(len(_UpperCAmelCase)		,      self.model_tester.num_hidden_layers)
               self.assertListEqual(
                   list(attentions[0].shape[-3:])		,      [self.model_tester.num_attention_heads / 2, encoder_seq_length, encoder_key_length]		,      )

          for model_class in self.all_model_classes:
               __A		:					Dict						=			True
               __A		:					Any						=			False
               __A		:					str						=			model_class(_UpperCAmelCase)
               __A		:					List[str]						=			model(self._prepare_for_class(_UpperCAmelCase		,      _UpperCAmelCase))
               __A		:					List[str]						=			len(_UpperCAmelCase)
               self.assertEqual(config.output_hidden_states		,      _UpperCAmelCase)
               check_encoder_attentions_output(_UpperCAmelCase)

               if self.is_encoder_decoder:
                    __A		:					Union[str, Any]						=			model_class(_UpperCAmelCase)
                    __A		:					int						=			model(self._prepare_for_class(_UpperCAmelCase		,      _UpperCAmelCase))
                    self.assertEqual(config.output_hidden_states		,      _UpperCAmelCase)
                    check_decoder_attentions_output(_UpperCAmelCase)

               # Check that output attentions can also be changed via the config
               del inputs_dict["output_attentions"]
               __A		:					int						=			True
               __A		:					Tuple						=			model_class(_UpperCAmelCase)
               __A		:					Dict						=			model(self._prepare_for_class(_UpperCAmelCase		,      _UpperCAmelCase))
               self.assertEqual(config.output_hidden_states		,      _UpperCAmelCase)
               check_encoder_attentions_output(_UpperCAmelCase)

               # Check attention is always last and order is fine
               __A		:					Any						=			True
               __A		:					str						=			True
               __A		:					Union[str, Any]						=			model_class(_UpperCAmelCase)
               __A		:					Union[str, Any]						=			model(self._prepare_for_class(_UpperCAmelCase		,      _UpperCAmelCase))

               self.assertEqual(out_len + (2 if self.is_encoder_decoder else 1)		,      len(_UpperCAmelCase))
               self.assertEqual(model.config.output_hidden_states		,      _UpperCAmelCase)
               check_encoder_attentions_output(_UpperCAmelCase)




@require_tf
class 					SCREAMING_SNAKE_CASE       (unittest.TestCase				):


     @slow
     def 				SCREAMING_SNAKE_CASE    (		self):

          '''simple docstring'''






          __A		:					Tuple						=			TFConvBertModel.from_pretrained('YituTech/conv-bert-base')
          __A		:					str						=			tf.constant([[0, 1, 2, 3, 4, 5]])
          __A		:					Optional[int]						=			model(_UpperCAmelCase)[0]

          __A		:					List[Any]						=			[1, 6, 768]
          self.assertEqual(output.shape		,      _UpperCAmelCase)

          __A		:					Tuple						=			tf.constant(
              [
                  [
                      [-0.03475493, -0.4686034, -0.30638832],
                      [0.22637248, -0.26988646, -0.7423424],
                      [0.10324868, -0.45013508, -0.58280784],
                  ]
              ])
          tf.debugging.assert_near(output[:, :3, :3]		,      _UpperCAmelCase		,      atol=1e-4)







"""simple docstring"""



from __future__ import annotations

from collections.abc import Iterator
from typing import Any




class 			lowerCAmelCase__			:
   def __init__(		self      :	Any							,			snake_case__      :	Any							):


        '''simple docstring'''
        UpperCAmelCase__						:    Any							=							data
        UpperCAmelCase__						:    Node | None							=							None




class 			lowerCAmelCase__			:
   def __init__(		self      :	Dict							):


        '''simple docstring'''
        UpperCAmelCase__						:    Tuple							=							None
        UpperCAmelCase__						:    Optional[int]							=							None
   def __iter__(		self      :	Tuple							):


        '''simple docstring'''
        UpperCAmelCase__						:    Optional[int]							=							self.head
        while self.head:
             yield node.data
             UpperCAmelCase__						:    Optional[Any]							=							node.next
             if node == self.head:
                  break
   def __len__(		self      :	Tuple							):


        '''simple docstring'''
        return sum(1 for _ in self							)
   def __repr__(		self      :	str							):


        '''simple docstring'''
        return "->".join(str(snake_case__							) for item in iter(self							)							)
   def       __a							(		self      :	Optional[Any]							,			snake_case__      :	Any							):


        '''simple docstring'''
        self.insert_nth(len(self							)							,			snake_case__							)
   def       __a							(		self      :	Optional[Any]							,			snake_case__      :	Any							):


        '''simple docstring'''
        self.insert_nth(0							,			snake_case__							)
   def       __a							(		self      :	Any							,			snake_case__      :	int							,			snake_case__      :	Any							):


        '''simple docstring'''
        if index < 0 or index > len(self							):
             raise IndexError("list index out of range."							)
        UpperCAmelCase__						:    Any							=							Node(snake_case__							)
        if self.head is None:
             UpperCAmelCase__						:    Union[str, Any]							=							new_node  # first node points itself
             UpperCAmelCase__						:    List[str]							=							new_node
        elif index == 0:  # insert at head
             UpperCAmelCase__						:    Optional[Any]							=							self.head
             UpperCAmelCase__						:    List[Any]							=							new_node
        else:
             UpperCAmelCase__						:    Union[str, Any]							=							self.head
             for _ in range(index - 1							):
                  UpperCAmelCase__						:    Dict							=							temp.next
             UpperCAmelCase__						:    Tuple							=							temp.next
             UpperCAmelCase__						:    str							=							new_node
             if index == len(self							) - 1:  # insert at tail
                  UpperCAmelCase__						:    Union[str, Any]							=							new_node
   def       __a							(		self      :	List[Any]							):


        '''simple docstring'''
        return self.delete_nth(0							)
   def       __a							(		self      :	Optional[Any]							):


        '''simple docstring'''
        return self.delete_nth(len(self							) - 1							)
   def       __a							(		self      :	Tuple							,			snake_case__      :	int = 0							):


        '''simple docstring'''
        if not 0 <= index < len(self							):
             raise IndexError("list index out of range."							)
        UpperCAmelCase__						:    Union[str, Any]							=							self.head
        if self.head == self.tail:  # just one node
             UpperCAmelCase__						:    str							=							None
        elif index == 0:  # delete head node
             UpperCAmelCase__						:    List[Any]							=							self.tail.next.next
             UpperCAmelCase__						:    Dict							=							self.head.next
        else:
             UpperCAmelCase__						:    List[Any]							=							self.head
             for _ in range(index - 1							):
                  UpperCAmelCase__						:    Tuple							=							temp.next
             UpperCAmelCase__						:    Dict							=							temp.next
             UpperCAmelCase__						:    Dict							=							temp.next.next
             if index == len(self							) - 1:  # delete at tail
                  UpperCAmelCase__						:    int							=							temp
        return delete_node.data




   def       __a							(		self      :	Any							):


        '''simple docstring'''
        return len(self							) == 0




def 	SCREAMING_SNAKE_CASE__       (  )->		None:






     '''simple docstring'''



     UpperCAmelCase__						:    str							=							CircularLinkedList()
     assert len(snake_case				) == 0
     assert circular_linked_list.is_empty() is True
     assert str(snake_case				) == ""

     try:
          circular_linked_list.delete_front()
          raise AssertionError  # This should not happen
     except IndexError:
          assert True  # This should happen

     try:
          circular_linked_list.delete_tail()
          raise AssertionError  # This should not happen
     except IndexError:
          assert True  # This should happen

     try:
          circular_linked_list.delete_nth(-1				)
          raise AssertionError
     except IndexError:
          assert True

     try:
          circular_linked_list.delete_nth(0				)
          raise AssertionError
     except IndexError:
          assert True

     assert circular_linked_list.is_empty() is True
     for i in range(5				):
          assert len(snake_case				) == i
          circular_linked_list.insert_nth(snake_case			,					i + 1				)
     assert str(snake_case				) == "->".join(str(snake_case				) for i in range(1			,					6				)				)

     circular_linked_list.insert_tail(6				)
     assert str(snake_case				) == "->".join(str(snake_case				) for i in range(1			,					7				)				)
     circular_linked_list.insert_head(0				)
     assert str(snake_case				) == "->".join(str(snake_case				) for i in range(0			,					7				)				)

     assert circular_linked_list.delete_front() == 0
     assert circular_linked_list.delete_tail() == 6
     assert str(snake_case				) == "->".join(str(snake_case				) for i in range(1			,					6				)				)
     assert circular_linked_list.delete_nth(2				) == 3

     circular_linked_list.insert_nth(2			,					3				)
     assert str(snake_case				) == "->".join(str(snake_case				) for i in range(1			,					6				)				)

     assert circular_linked_list.is_empty() is False


if __name__ == "__main__":
 import doctest

 doctest.testmod()


