((props, r
readOnly={readOnly}
{...restProps}
/>
+ {allowClear && (
+
+ )}
{suffix !== undefined && (
diff --git a/tests/allowClear.test.tsx b/tests/allowClear.test.tsx
new file mode 100644
index 00000000..268464c3
--- /dev/null
+++ b/tests/allowClear.test.tsx
@@ -0,0 +1,174 @@
+import * as React from 'react';
+import { render, fireEvent } from '@testing-library/react';
+import InputNumber from '../src';
+
+describe('InputNumber.AllowClear', () => {
+ it('should render clear icon when allowClear is true and value is not empty', () => {
+ const { container } = render(
+
+ );
+
+ const clearIcon = container.querySelector('.rc-input-number-clear-icon');
+ expect(clearIcon).toBeTruthy();
+ expect(clearIcon).not.toHaveClass('rc-input-number-clear-icon-hidden');
+ });
+
+ it('should not render clear icon when value is empty', () => {
+ const { container } = render(
+
+ );
+
+ const clearIcon = container.querySelector('.rc-input-number-clear-icon');
+ expect(clearIcon).toHaveClass('rc-input-number-clear-icon-hidden');
+ });
+
+ it('should render clear icon when value is 0', () => {
+ const { container } = render(
+
+ );
+ const clearIcon = container.querySelector('.rc-input-number-clear-icon');
+ expect(clearIcon).not.toHaveClass('rc-input-number-clear-icon-hidden');
+ });
+
+ it('should not render clear icon when disabled', () => {
+ const { container } = render(
+
+ );
+
+ const clearIcon = container.querySelector('.rc-input-number-clear-icon');
+ expect(clearIcon).toHaveClass('rc-input-number-clear-icon-hidden');
+ });
+
+ it('should not render clear icon when readOnly', () => {
+ const { container } = render(
+
+ );
+
+ const clearIcon = container.querySelector('.rc-input-number-clear-icon');
+ expect(clearIcon).toHaveClass('rc-input-number-clear-icon-hidden');
+ });
+
+ it('should clear value to null when allowClear is true (boolean type)', () => {
+ const onChange = jest.fn();
+ const { container } = render(
+
+ );
+
+ const clearIcon = container.querySelector('.rc-input-number-clear-icon');
+ fireEvent.click(clearIcon);
+
+ expect(onChange).toHaveBeenCalledTimes(1);
+ expect(onChange).toHaveBeenCalledWith(null);
+ });
+
+ it('should clear value to custom value when allowClear is object with clearValue', () => {
+ const onChange = jest.fn();
+ const { container } = render(
+
+ );
+
+ const clearIcon = container.querySelector('.rc-input-number-clear-icon');
+ fireEvent.click(clearIcon);
+
+ expect(onChange).toHaveBeenCalledTimes(1);
+ expect(onChange).toHaveBeenCalledWith(0);
+ });
+
+ it('should handle string clearValue correctly', () => {
+ const onChange = jest.fn();
+ const { container } = render(
+
+ );
+
+ const clearIcon = container.querySelector('.rc-input-number-clear-icon');
+ fireEvent.click(clearIcon);
+
+ expect(onChange).toHaveBeenCalledTimes(1);
+ expect(onChange).toHaveBeenCalledWith(null);
+ });
+
+ it('should support all clearValue types', () => {
+ const onChange1 = jest.fn();
+ const onChange2 = jest.fn();
+ const onChange3 = jest.fn();
+
+ // Test number clearValue
+ const { container: container1, unmount: unmount1 } = render(
+
+ );
+ fireEvent.click(container1.querySelector('.rc-input-number-clear-icon'));
+ expect(onChange1).toHaveBeenCalledWith(42);
+ unmount1();
+
+ // Test zero clearValue
+ const { container: container2, unmount: unmount2 } = render(
+
+ );
+ fireEvent.click(container2.querySelector('.rc-input-number-clear-icon'));
+ expect(onChange2).toHaveBeenCalledWith(0);
+ unmount2();
+
+ // Test undefined clearValue
+ const { container: container3, unmount: unmount3 } = render(
+
+ );
+ fireEvent.click(container3.querySelector('.rc-input-number-clear-icon'));
+ expect(onChange3).toHaveBeenCalledWith(null);
+ unmount3();
+ });
+
+ it('should trigger onClear callback when clear icon is clicked', () => {
+ const onClear = jest.fn();
+ const onChange = jest.fn();
+ const { container } = render(
+
+ );
+
+ const clearIcon = container.querySelector('.rc-input-number-clear-icon');
+ fireEvent.click(clearIcon);
+
+ expect(onClear).toHaveBeenCalledTimes(1);
+ expect(onChange).toHaveBeenCalledTimes(1);
+ });
+
+ it('should have correct className when suffix is provided', () => {
+ const { container } = render(
+
+ );
+
+ const clearIcon = container.querySelector('.rc-input-number-clear-icon');
+ expect(clearIcon).toHaveClass('rc-input-number-clear-icon-has-suffix');
+ });
+
+ it('should work with defaultValue', () => {
+ const onChange = jest.fn();
+ const { container } = render(
+
+ );
+
+ const clearIcon = container.querySelector('.rc-input-number-clear-icon');
+ expect(clearIcon).not.toHaveClass('rc-input-number-clear-icon-hidden');
+ fireEvent.click(clearIcon);
+
+ expect(onChange).toHaveBeenCalledTimes(1);
+ expect(onChange).toHaveBeenCalledWith(null);
+ });
+});
\ No newline at end of file