select multiple namebeatles option valuej selectedjohnoption option valueppauloption option valueggeorgeoption option valuerringooption select def testrendermultipleselectedself self checkhtml self widgetchoicesself beatles beatles j p html if the value is none none of the options are selected even if the choices have an empty option select multiple namebeatles option valueunknownoption option valuejjohnoption option valueppauloption option valueggeorgeoption option valuerringooption select def testrendervaluelabelself self checkhtml self widgetchoicesself beatles beatles john html multiple options with the same value can be selected 8103 select multiple namechoices option value0 selected0option option value11option option value22option option value33option option value0 selectedextraoption select def testmultiplevaluesinvalidself self checkhtml self widgetchoicesself beatles beatles j g foo html select multiple namenums option value11option option value2 selected2option option value33option select self checkhtml self widgetchoiceschoices nums 2 html select multiple namenums option value11option option value2 selected2option option value33option select def testoptgroupselectmultipleself widget selectmultiple choices outer1 outer 1 group 1 inner1 inner 1 inner2 inner 2 self checkhtml widget nestchoice outer1 inner2 html select multiple name beatles option value j selected john option option value p paul option option value g george option option value r ringo option select select multiple name beatles option value j selected john option option value p selected paul option option value g george option option value r ringo option select if the value is none none of the options are selected even if the choices have an empty option select multiple name beatles option value unknown option option value j john option option value p paul option option value g george option option value r ringo option select if the value corresponds to a label but not to an option value none of the options are selected select multiple name beatles option value j john option option value p paul option option value g george option option value r ringo option select multiple options with the same value can be selected 8103 select multiple name choices option value 0 selected 0 option option value 1 1 option option value 2 2 option option value 3 3 option option value 0 selected extra option select if multiple values are given but some of them are not valid the valid ones are selected select multiple name beatles option value j selected john option option value p paul option option value g selected george option option value r ringo option select select multiple name nums option value 1 1 option option value 2 selected 2 option option value 3 3 option select select multiple name nums option value 1 1 option option value 2 selected 2 option option value 3 3 option select select multiple name nums option value 1 1 option option value 2 selected 2 option option value 3 3 option select select multiple name nestchoice option value outer1 selected outer 1 option optgroup label group quot 1 quot option value inner1 inner 1 option option value inner2 selected inner 2 option optgroup select
from django.forms import ChoiceField, Form, SelectMultiple

from .base import WidgetTest


class SelectMultipleTest(WidgetTest):
    widget = SelectMultiple
    numeric_choices = (("0", "0"), ("1", "1"), ("2", "2"), ("3", "3"), ("0", "extra"))

    def test_format_value(self):
        widget = self.widget(choices=self.numeric_choices)
        self.assertEqual(widget.format_value(None), [])
        self.assertEqual(widget.format_value(""), [""])
        self.assertEqual(widget.format_value([3, 0, 1]), ["3", "0", "1"])

    def test_render_selected(self):
        self.check_html(
            self.widget(choices=self.beatles),
            "beatles",
            ["J"],
            html=(
                
            ),
        )

    def test_render_multiple_selected(self):
        self.check_html(
            self.widget(choices=self.beatles),
            "beatles",
            ["J", "P"],
            html=(
                
            ),
        )

    def test_render_none(self):
        
        self.check_html(
            self.widget(choices=(("", "Unknown"),) + self.beatles),
            "beatles",
            None,
            html=(
                
            ),
        )

    def test_render_value_label(self):
        
        self.check_html(
            self.widget(choices=self.beatles),
            "beatles",
            ["John"],
            html=(
                
            ),
        )

    def test_multiple_options_same_value(self):
        
        self.check_html(
            self.widget(choices=self.numeric_choices),
            "choices",
            ["0"],
            html=(
                
            ),
        )

    def test_multiple_values_invalid(self):
        
        self.check_html(
            self.widget(choices=self.beatles),
            "beatles",
            ["J", "G", "foo"],
            html=(
                
            ),
        )

    def test_compare_string(self):
        choices = [("1", "1"), ("2", "2"), ("3", "3")]

        self.check_html(
            self.widget(choices=choices),
            "nums",
            [2],
            html=(
                
            ),
        )

        self.check_html(
            self.widget(choices=choices),
            "nums",
            ["2"],
            html=(
                
            ),
        )

        self.check_html(
            self.widget(choices=choices),
            "nums",
            [2],
            html=(
                
            ),
        )

    def test_optgroup_select_multiple(self):
        widget = SelectMultiple(
            choices=(
                ("outer1", "Outer 1"),
                ('Group "1"', (("inner1", "Inner 1"), ("inner2", "Inner 2"))),
            )
        )
        self.check_html(
            widget,
            "nestchoice",
            ["outer1", "inner2"],
            html=(
                
            ),
        )

    def test_value_omitted_from_data(self):
        widget = self.widget(choices=self.beatles)
        self.assertIs(widget.value_omitted_from_data({}, {}, "field"), False)
        self.assertIs(
            widget.value_omitted_from_data({"field": "value"}, {}, "field"), False
        )

    def test_fieldset(self):
        class TestForm(Form):
            template_name = "forms_tests/use_fieldset.html"
            field = ChoiceField(
                widget=self.widget, choices=self.beatles, required=False
            )

        form = TestForm()
        self.assertIs(self.widget.use_fieldset, False)
        self.assertHTMLEqual(
            '<div><label for="id_field">Field:</label>'
            '<select multiple name="field" id="id_field">'
            '<option value="J">John</option>  <option value="P">Paul</option>'
            '<option value="G">George</option><option value="R">Ringo'
            "</option></select></div>",
            form.render(),
        )