We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Adding 0 and 1 coords if missed in colormap
# Description
<!-- What does this pull request (PR) do? Why is it necessary? -->
<!-- Tell us about your new feature, improvement, or fix! -->
<!-- If your change includes user interface changes, please add an image, or an animation "An image is worth a thousando words!" -->
<!-- You can use https://www.cockos.com/licecap/ or similar to create animations -->
Fix #2400

## Type of change
<!-- Please delete options that are not relevant. -->


# References
<!-- What resources, documentation, and guides were used in the creation of this PR? -->
<!-- If this is a bug-fix or otherwise resolves an issue, reference it here with "closes #(issue)" -->

# How has this been tested?
<!-- Please describe the tests that you ran to verify your changes. -->
- [ ] example: the test suite for my feature covers cases x, y, and z
- [ ] example: all tests pass with my change

## Final checklist:
- [ ] My PR is the minimum possible work for the desired functionality
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] I have added tests that prove my fix is effective or that my feature works

Adding 0 and 1 coords if missed in colormap
# Description
<!-- What does this pull request (PR) do? Why is it necessary? -->
<!-- Tell us about your new feature, improvement, or fix! -->
<!-- If your change includes user interface changes, please add an image, or an animation "An image is worth a thousando words!" -->
<!-- You can use https://www.cockos.com/licecap/ or similar to create animations -->
Fix #2400

## Type of change
<!-- Please delete options that are not relevant. -->


# References
<!-- What resources, documentation, and guides were used in the creation of this PR? -->
<!-- If this is a bug-fix or otherwise resolves an issue, reference it here with "closes #(issue)" -->

# How has this been tested?
<!-- Please describe the tests that you ran to verify your changes. -->
- [ ] example: the test suite for my feature covers cases x, y, and z
- [ ] example: all tests pass with my change

## Final checklist:
- [ ] My PR is the minimum possible work for the desired functionality
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] I have added tests that prove my fix is effective or that my feature works


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `napari/utils/colormaps/colormap.py`
Content:
```
1 from enum import Enum
2 from typing import Optional
3 
4 import numpy as np
5 from pydantic import PrivateAttr, validator
6 
7 from ..events import EventedModel
8 from ..events.custom_types import Array
9 from ..translations import trans
10 from .colorbars import make_colorbar
11 from .standardize_color import transform_color
12 
13 
14 class ColormapInterpolationMode(str, Enum):
15     """INTERPOLATION: Interpolation mode for colormaps.
16 
17     Selects an interpolation mode for the colormap.
18             * linear: colors are defined by linear interpolation between
19               colors of neighboring controls points.
20             * zero: colors are defined by the value of the color in the
21               bin between by neighboring controls points.
22     """
23 
24     LINEAR = 'linear'
25     ZERO = 'zero'
26 
27 
28 class Colormap(EventedModel):
29     """Colormap that relates intensity values to colors.
30 
31     Attributes
32     ----------
33     colors : array, shape (N, 4)
34         Data used in the colormap.
35     name : str
36         Name of the colormap.
37     display_name : str
38         Display name of the colormap.
39     controls : array, shape (N,) or (N+1,)
40         Control points of the colormap.
41     interpolation : str
42         Colormap interpolation mode, either 'linear' or
43         'zero'. If 'linear', ncontrols = ncolors (one
44         color per control point). If 'zero', ncontrols
45         = ncolors+1 (one color per bin).
46     """
47 
48     # fields
49     colors: Array[float, (-1, 4)]
50     name: str = 'custom'
51     _display_name: Optional[str] = PrivateAttr(None)
52     interpolation: ColormapInterpolationMode = ColormapInterpolationMode.LINEAR
53     controls: Array[float, (-1,)] = None
54 
55     def __init__(self, colors, display_name: Optional[str] = None, **data):
56         if display_name is None:
57             display_name = data.get('name', 'custom')
58 
59         super().__init__(colors=colors, **data)
60         self._display_name = display_name
61 
62     # validators
63     @validator('colors', pre=True)
64     def _ensure_color_array(cls, v):
65         return transform_color(v)
66 
67     # controls validator must be called even if None for correct initialization
68     @validator('controls', pre=True, always=True)
69     def _check_controls(cls, v, values):
70         if v is None or len(v) == 0:
71             n_controls = len(values['colors']) + int(
72                 values['interpolation'] == ColormapInterpolationMode.ZERO
73             )
74             return np.linspace(0, 1, n_controls)
75         return v
76 
77     def __iter__(self):
78         yield from (self.colors, self.controls, self.interpolation)
79 
80     def map(self, values):
81         values = np.atleast_1d(values)
82         if self.interpolation == ColormapInterpolationMode.LINEAR:
83             # One color per control point
84             cols = [
85                 np.interp(values, self.controls, self.colors[:, i])
86                 for i in range(4)
87             ]
88             cols = np.stack(cols, axis=1)
89         elif self.interpolation == ColormapInterpolationMode.ZERO:
90             # One color per bin
91             indices = np.clip(
92                 np.searchsorted(self.controls, values) - 1, 0, len(self.colors)
93             )
94             cols = self.colors[indices.astype(np.int32)]
95         else:
96             raise ValueError(
97                 trans._(
98                     'Unrecognized Colormap Interpolation Mode',
99                     deferred=True,
100                 )
101             )
102 
103         return cols
104 
105     @property
106     def colorbar(self):
107         return make_colorbar(self)
108
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/napari/utils/colormaps/colormap.py b/napari/utils/colormaps/colormap.py
--- a/napari/utils/colormaps/colormap.py
+++ b/napari/utils/colormaps/colormap.py
@@ -67,11 +67,44 @@
     # controls validator must be called even if None for correct initialization
     @validator('controls', pre=True, always=True)
     def _check_controls(cls, v, values):
+        # If no control points provided generate defaults
         if v is None or len(v) == 0:
             n_controls = len(values['colors']) + int(
                 values['interpolation'] == ColormapInterpolationMode.ZERO
             )
             return np.linspace(0, 1, n_controls)
+
+        # Check control end points are correct
+        if not (v[0] == 0 and v[-1] == 1):
+            raise ValueError(
+                trans._(
+                    f'Control points must start with 0.0 and end with 1.0. Got {v[0]} and {v[-1]}',
+                    deferred=True,
+                )
+            )
+
+        # Check control points are sorted correctly
+        if not np.array_equal(v, sorted(v)):
+            raise ValueError(
+                trans._(
+                    'Control points need to be sorted in ascending order',
+                    deferred=True,
+                )
+            )
+
+        # Check number of control points is correct
+        n_controls_target = len(values['colors']) + int(
+            values['interpolation'] == ColormapInterpolationMode.ZERO
+        )
+        n_controls = len(v)
+        if not n_controls == n_controls_target:
+            raise ValueError(
+                trans._(
+                    f'Wrong number of control points provided. Expected {n_controls_target}, got {n_controls}',
+                    deferred=True,
+                )
+            )
+
         return v
 
     def __iter__(self):

{"golden_diff": "diff --git a/napari/utils/colormaps/colormap.py b/napari/utils/colormaps/colormap.py\n--- a/napari/utils/colormaps/colormap.py\n+++ b/napari/utils/colormaps/colormap.py\n@@ -67,11 +67,44 @@\n     # controls validator must be called even if None for correct initialization\n     @validator('controls', pre=True, always=True)\n     def _check_controls(cls, v, values):\n+        # If no control points provided generate defaults\n         if v is None or len(v) == 0:\n             n_controls = len(values['colors']) + int(\n                 values['interpolation'] == ColormapInterpolationMode.ZERO\n             )\n             return np.linspace(0, 1, n_controls)\n+\n+        # Check control end points are correct\n+        if not (v[0] == 0 and v[-1] == 1):\n+            raise ValueError(\n+                trans._(\n+                    f'Control points must start with 0.0 and end with 1.0. Got {v[0]} and {v[-1]}',\n+                    deferred=True,\n+                )\n+            )\n+\n+        # Check control points are sorted correctly\n+        if not np.array_equal(v, sorted(v)):\n+            raise ValueError(\n+                trans._(\n+                    'Control points need to be sorted in ascending order',\n+                    deferred=True,\n+                )\n+            )\n+\n+        # Check number of control points is correct\n+        n_controls_target = len(values['colors']) + int(\n+            values['interpolation'] == ColormapInterpolationMode.ZERO\n+        )\n+        n_controls = len(v)\n+        if not n_controls == n_controls_target:\n+            raise ValueError(\n+                trans._(\n+                    f'Wrong number of control points provided. Expected {n_controls_target}, got {n_controls}',\n+                    deferred=True,\n+                )\n+            )\n+\n         return v\n \n     def __iter__(self):\n", "issue": "Adding 0 and 1 coords if missed in colormap\n# Description\r\n<!-- What does this pull request (PR) do? Why is it necessary? -->\r\n<!-- Tell us about your new feature, improvement, or fix! -->\r\n<!-- If your change includes user interface changes, please add an image, or an animation \"An image is worth a thousando words!\" -->\r\n<!-- You can use https://www.cockos.com/licecap/ or similar to create animations -->\r\nFix #2400\r\n\r\n## Type of change\r\n<!-- Please delete options that are not relevant. -->\r\n\r\n\r\n# References\r\n<!-- What resources, documentation, and guides were used in the creation of this PR? -->\r\n<!-- If this is a bug-fix or otherwise resolves an issue, reference it here with \"closes #(issue)\" -->\r\n\r\n# How has this been tested?\r\n<!-- Please describe the tests that you ran to verify your changes. -->\r\n- [ ] example: the test suite for my feature covers cases x, y, and z\r\n- [ ] example: all tests pass with my change\r\n\r\n## Final checklist:\r\n- [ ] My PR is the minimum possible work for the desired functionality\r\n- [ ] I have commented my code, particularly in hard-to-understand areas\r\n- [ ] I have made corresponding changes to the documentation\r\n- [x] I have added tests that prove my fix is effective or that my feature works\r\n\nAdding 0 and 1 coords if missed in colormap\n# Description\r\n<!-- What does this pull request (PR) do? Why is it necessary? -->\r\n<!-- Tell us about your new feature, improvement, or fix! -->\r\n<!-- If your change includes user interface changes, please add an image, or an animation \"An image is worth a thousando words!\" -->\r\n<!-- You can use https://www.cockos.com/licecap/ or similar to create animations -->\r\nFix #2400\r\n\r\n## Type of change\r\n<!-- Please delete options that are not relevant. -->\r\n\r\n\r\n# References\r\n<!-- What resources, documentation, and guides were used in the creation of this PR? -->\r\n<!-- If this is a bug-fix or otherwise resolves an issue, reference it here with \"closes #(issue)\" -->\r\n\r\n# How has this been tested?\r\n<!-- Please describe the tests that you ran to verify your changes. -->\r\n- [ ] example: the test suite for my feature covers cases x, y, and z\r\n- [ ] example: all tests pass with my change\r\n\r\n## Final checklist:\r\n- [ ] My PR is the minimum possible work for the desired functionality\r\n- [ ] I have commented my code, particularly in hard-to-understand areas\r\n- [ ] I have made corresponding changes to the documentation\r\n- [x] I have added tests that prove my fix is effective or that my feature works\r\n\n", "before_files": [{"content": "from enum import Enum\nfrom typing import Optional\n\nimport numpy as np\nfrom pydantic import PrivateAttr, validator\n\nfrom ..events import EventedModel\nfrom ..events.custom_types import Array\nfrom ..translations import trans\nfrom .colorbars import make_colorbar\nfrom .standardize_color import transform_color\n\n\nclass ColormapInterpolationMode(str, Enum):\n    \"\"\"INTERPOLATION: Interpolation mode for colormaps.\n\n    Selects an interpolation mode for the colormap.\n            * linear: colors are defined by linear interpolation between\n              colors of neighboring controls points.\n            * zero: colors are defined by the value of the color in the\n              bin between by neighboring controls points.\n    \"\"\"\n\n    LINEAR = 'linear'\n    ZERO = 'zero'\n\n\nclass Colormap(EventedModel):\n    \"\"\"Colormap that relates intensity values to colors.\n\n    Attributes\n    ----------\n    colors : array, shape (N, 4)\n        Data used in the colormap.\n    name : str\n        Name of the colormap.\n    display_name : str\n        Display name of the colormap.\n    controls : array, shape (N,) or (N+1,)\n        Control points of the colormap.\n    interpolation : str\n        Colormap interpolation mode, either 'linear' or\n        'zero'. If 'linear', ncontrols = ncolors (one\n        color per control point). If 'zero', ncontrols\n        = ncolors+1 (one color per bin).\n    \"\"\"\n\n    # fields\n    colors: Array[float, (-1, 4)]\n    name: str = 'custom'\n    _display_name: Optional[str] = PrivateAttr(None)\n    interpolation: ColormapInterpolationMode = ColormapInterpolationMode.LINEAR\n    controls: Array[float, (-1,)] = None\n\n    def __init__(self, colors, display_name: Optional[str] = None, **data):\n        if display_name is None:\n            display_name = data.get('name', 'custom')\n\n        super().__init__(colors=colors, **data)\n        self._display_name = display_name\n\n    # validators\n    @validator('colors', pre=True)\n    def _ensure_color_array(cls, v):\n        return transform_color(v)\n\n    # controls validator must be called even if None for correct initialization\n    @validator('controls', pre=True, always=True)\n    def _check_controls(cls, v, values):\n        if v is None or len(v) == 0:\n            n_controls = len(values['colors']) + int(\n                values['interpolation'] == ColormapInterpolationMode.ZERO\n            )\n            return np.linspace(0, 1, n_controls)\n        return v\n\n    def __iter__(self):\n        yield from (self.colors, self.controls, self.interpolation)\n\n    def map(self, values):\n        values = np.atleast_1d(values)\n        if self.interpolation == ColormapInterpolationMode.LINEAR:\n            # One color per control point\n            cols = [\n                np.interp(values, self.controls, self.colors[:, i])\n                for i in range(4)\n            ]\n            cols = np.stack(cols, axis=1)\n        elif self.interpolation == ColormapInterpolationMode.ZERO:\n            # One color per bin\n            indices = np.clip(\n                np.searchsorted(self.controls, values) - 1, 0, len(self.colors)\n            )\n            cols = self.colors[indices.astype(np.int32)]\n        else:\n            raise ValueError(\n                trans._(\n                    'Unrecognized Colormap Interpolation Mode',\n                    deferred=True,\n                )\n            )\n\n        return cols\n\n    @property\n    def colorbar(self):\n        return make_colorbar(self)\n", "path": "napari/utils/colormaps/colormap.py"}], "after_files": [{"content": "from enum import Enum\nfrom typing import Optional\n\nimport numpy as np\nfrom pydantic import PrivateAttr, validator\n\nfrom ..events import EventedModel\nfrom ..events.custom_types import Array\nfrom ..translations import trans\nfrom .colorbars import make_colorbar\nfrom .standardize_color import transform_color\n\n\nclass ColormapInterpolationMode(str, Enum):\n    \"\"\"INTERPOLATION: Interpolation mode for colormaps.\n\n    Selects an interpolation mode for the colormap.\n            * linear: colors are defined by linear interpolation between\n              colors of neighboring controls points.\n            * zero: colors are defined by the value of the color in the\n              bin between by neighboring controls points.\n    \"\"\"\n\n    LINEAR = 'linear'\n    ZERO = 'zero'\n\n\nclass Colormap(EventedModel):\n    \"\"\"Colormap that relates intensity values to colors.\n\n    Attributes\n    ----------\n    colors : array, shape (N, 4)\n        Data used in the colormap.\n    name : str\n        Name of the colormap.\n    display_name : str\n        Display name of the colormap.\n    controls : array, shape (N,) or (N+1,)\n        Control points of the colormap.\n    interpolation : str\n        Colormap interpolation mode, either 'linear' or\n        'zero'. If 'linear', ncontrols = ncolors (one\n        color per control point). If 'zero', ncontrols\n        = ncolors+1 (one color per bin).\n    \"\"\"\n\n    # fields\n    colors: Array[float, (-1, 4)]\n    name: str = 'custom'\n    _display_name: Optional[str] = PrivateAttr(None)\n    interpolation: ColormapInterpolationMode = ColormapInterpolationMode.LINEAR\n    controls: Array[float, (-1,)] = None\n\n    def __init__(self, colors, display_name: Optional[str] = None, **data):\n        if display_name is None:\n            display_name = data.get('name', 'custom')\n\n        super().__init__(colors=colors, **data)\n        self._display_name = display_name\n\n    # validators\n    @validator('colors', pre=True)\n    def _ensure_color_array(cls, v):\n        return transform_color(v)\n\n    # controls validator must be called even if None for correct initialization\n    @validator('controls', pre=True, always=True)\n    def _check_controls(cls, v, values):\n        # If no control points provided generate defaults\n        if v is None or len(v) == 0:\n            n_controls = len(values['colors']) + int(\n                values['interpolation'] == ColormapInterpolationMode.ZERO\n            )\n            return np.linspace(0, 1, n_controls)\n\n        # Check control end points are correct\n        if not (v[0] == 0 and v[-1] == 1):\n            raise ValueError(\n                trans._(\n                    f'Control points must start with 0.0 and end with 1.0. Got {v[0]} and {v[-1]}',\n                    deferred=True,\n                )\n            )\n\n        # Check control points are sorted correctly\n        if not np.array_equal(v, sorted(v)):\n            raise ValueError(\n                trans._(\n                    'Control points need to be sorted in ascending order',\n                    deferred=True,\n                )\n            )\n\n        # Check number of control points is correct\n        n_controls_target = len(values['colors']) + int(\n            values['interpolation'] == ColormapInterpolationMode.ZERO\n        )\n        n_controls = len(v)\n        if not n_controls == n_controls_target:\n            raise ValueError(\n                trans._(\n                    f'Wrong number of control points provided. Expected {n_controls_target}, got {n_controls}',\n                    deferred=True,\n                )\n            )\n\n        return v\n\n    def __iter__(self):\n        yield from (self.colors, self.controls, self.interpolation)\n\n    def map(self, values):\n        values = np.atleast_1d(values)\n        if self.interpolation == ColormapInterpolationMode.LINEAR:\n            # One color per control point\n            cols = [\n                np.interp(values, self.controls, self.colors[:, i])\n                for i in range(4)\n            ]\n            cols = np.stack(cols, axis=1)\n        elif self.interpolation == ColormapInterpolationMode.ZERO:\n            # One color per bin\n            indices = np.clip(\n                np.searchsorted(self.controls, values) - 1, 0, len(self.colors)\n            )\n            cols = self.colors[indices.astype(np.int32)]\n        else:\n            raise ValueError(\n                trans._(\n                    'Unrecognized Colormap Interpolation Mode',\n                    deferred=True,\n                )\n            )\n\n        return cols\n\n    @property\n    def colorbar(self):\n        return make_colorbar(self)\n", "path": "napari/utils/colormaps/colormap.py"}]}