igniteui-angular-sovn
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
381 lines (318 loc) • 14.2 kB
text/typescript
import { Component, OnInit, ViewChild } from '@angular/core';
import { TestBed, waitForAsync } from '@angular/core/testing';
import { ButtonGroupAlignment, IgxButtonGroupComponent } from './buttonGroup.component';
import { configureTestSuite } from '../test-utils/configure-suite';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { UIInteractions } from '../test-utils/ui-interactions.spec';
import { IgxButtonDirective } from '../directives/button/button.directive';
interface IButton {
type?: string;
ripple?: string;
label?: string;
disabled?: boolean;
togglable?: boolean;
selected?: boolean;
color?: string;
bgcolor?: string;
icon?: string;
}
class Button {
private type: string;
private ripple: string;
private label: string;
private disabled: boolean;
private togglable: boolean;
private selected: boolean;
private color: string;
private bgcolor: string;
private icon: string;
constructor(obj?: IButton) {
this.type = obj.type || 'raised';
this.ripple = obj.ripple || 'orange';
this.label = obj.label || 'Button label';
this.selected = obj.selected || false;
this.togglable = obj.togglable && true;
this.disabled = obj.disabled || false;
this.color = obj.color || '#484848';
this.bgcolor = obj.bgcolor || 'white';
this.icon = obj.icon || '';
}
}
describe('IgxButtonGroup', () => {
configureTestSuite();
beforeAll(waitForAsync(() => {
TestBed.configureTestingModule({
imports: [
NoopAnimationsModule,
InitButtonGroupComponent,
InitButtonGroupWithValuesComponent,
TemplatedButtonGroupComponent,
TemplatedButtonGroupDesplayDensityComponent
]
}).compileComponents();
}));
it('should initialize buttonGroup with default values', () => {
const fixture = TestBed.createComponent(InitButtonGroupComponent);
fixture.detectChanges();
const instance = fixture.componentInstance;
const buttongroup = fixture.componentInstance.buttonGroup;
expect(instance.buttonGroup).toBeDefined();
expect(buttongroup instanceof IgxButtonGroupComponent).toBe(true);
expect(instance.buttonGroup.id).toContain('igx-buttongroup-');
expect(buttongroup.disabled).toBeFalsy();
expect(buttongroup.alignment).toBe(ButtonGroupAlignment.horizontal);
expect(buttongroup.multiSelection).toBeFalsy();
expect(buttongroup.itemContentCssClass).toBeUndefined();
expect(buttongroup.selectedIndexes.length).toEqual(1);
expect(buttongroup.selectedButtons.length).toEqual(1);
});
it('should initialize buttonGroup with passed values', () => {
const fixture = TestBed.createComponent(InitButtonGroupWithValuesComponent);
fixture.detectChanges();
const instance = fixture.componentInstance;
const buttongroup = fixture.componentInstance.buttonGroup;
expect(instance.buttonGroup).toBeDefined();
expect(buttongroup instanceof IgxButtonGroupComponent).toBe(true);
expect(buttongroup.disabled).toBeFalsy();
expect(buttongroup.alignment).toBe(ButtonGroupAlignment.vertical);
expect(buttongroup.multiSelection).toBeTruthy();
expect(buttongroup.itemContentCssClass).toEqual('customContentStyle');
expect(buttongroup.selectedIndexes.length).toEqual(0);
expect(buttongroup.selectedButtons.length).toEqual(0);
});
it('Button Group single selection', () => {
const fixture = TestBed.createComponent(InitButtonGroupComponent);
fixture.detectChanges();
const buttongroup = fixture.componentInstance.buttonGroup;
buttongroup.selectButton(0);
expect(buttongroup.selectedButtons.length).toBe(1);
expect(buttongroup.buttons.indexOf(buttongroup.selectedButtons[0])).toBe(0);
buttongroup.selectButton(2);
expect(buttongroup.selectedButtons.length).toBe(1);
expect(buttongroup.buttons.indexOf(buttongroup.selectedButtons[0])).toBe(2);
});
it('Button Group multiple selection', () => {
const fixture = TestBed.createComponent(InitButtonGroupWithValuesComponent);
fixture.detectChanges();
const buttongroup = fixture.componentInstance.buttonGroup;
expect(buttongroup.multiSelection).toBeTruthy();
buttongroup.selectButton(1);
expect(buttongroup.selectedButtons.length).toBe(1);
buttongroup.selectButton(2);
expect(buttongroup.selectedButtons.length).toBe(2);
buttongroup.deselectButton(2);
buttongroup.deselectButton(1);
expect(buttongroup.selectedButtons.length).toBe(0);
buttongroup.selectButton(0);
buttongroup.selectButton(3);
// Button 3 is disabled, but it can be selected
expect(buttongroup.selectedButtons.length).toBe(2);
});
it('Button Group multiple selection with mouse click', () => {
const fixture = TestBed.createComponent(InitButtonGroupWithValuesComponent);
fixture.detectChanges();
const buttongroup = fixture.componentInstance.buttonGroup;
expect(buttongroup.multiSelection).toBeTruthy();
UIInteractions.simulateClickEvent(buttongroup.buttons[0].nativeElement);
expect(buttongroup.selectedButtons.length).toBe(1);
UIInteractions.simulateClickEvent(buttongroup.buttons[1].nativeElement);
expect(buttongroup.selectedButtons.length).toBe(2);
UIInteractions.simulateClickEvent(buttongroup.buttons[0].nativeElement);
UIInteractions.simulateClickEvent(buttongroup.buttons[1].nativeElement);
expect(buttongroup.selectedButtons.length).toBe(0);
UIInteractions.simulateClickEvent(buttongroup.buttons[0].nativeElement);
UIInteractions.simulateClickEvent(buttongroup.buttons[3].nativeElement);
// Button 3 is disabled, and it should not be selected with mouse click
expect(buttongroup.selectedButtons.length).toBe(1);
});
it('Button Group - templated buttons with multiple selection', () => {
const fixture = TestBed.createComponent(TemplatedButtonGroupComponent);
fixture.detectChanges();
const buttongroup = fixture.componentInstance.buttonGroup;
expect(buttongroup.buttons.length).toBe(4);
expect(buttongroup.multiSelection).toBeTruthy();
buttongroup.selectButton(1);
expect(buttongroup.selectedButtons.length).toBe(1);
buttongroup.selectButton(2);
expect(buttongroup.selectedButtons.length).toBe(2);
buttongroup.deselectButton(1);
buttongroup.deselectButton(2);
expect(buttongroup.selectedButtons.length).toBe(0);
buttongroup.selectButton(0);
buttongroup.selectButton(3);
// It should be possible to select disabled buttons
expect(buttongroup.selectedButtons.length).toBe(2);
buttongroup.deselectButton(3);
expect(buttongroup.selectedButtons.length).toBe(1);
});
it('Button Group - templated buttons with single selection', () => {
const fixture = TestBed.createComponent(TemplatedButtonGroupComponent);
fixture.componentInstance.multiselection = false;
fixture.detectChanges();
const buttongroup = fixture.componentInstance.buttonGroup;
expect(buttongroup.buttons.length).toBe(4);
expect(buttongroup.multiSelection).toBeFalsy();
buttongroup.selectButton(1);
expect(buttongroup.selectedButtons.length).toBe(1);
expect(buttongroup.buttons.indexOf(buttongroup.selectedButtons[0])).toBe(1);
buttongroup.selectButton(2);
expect(buttongroup.selectedButtons.length).toBe(1);
expect(buttongroup.buttons.indexOf(buttongroup.selectedButtons[0])).toBe(2);
buttongroup.deselectButton(2);
expect(buttongroup.selectedButtons.length).toBe(0);
buttongroup.selectButton(0);
buttongroup.selectButton(2);
buttongroup.selectButton(3);
expect(buttongroup.selectedButtons.length).toBe(1);
// Button 3 is disabled, but it can be selected
expect(buttongroup.buttons.indexOf(buttongroup.selectedButtons[0])).toBe(3);
});
it('Button Group - selection handles wrong indexes gracefully', () => {
const fixture = TestBed.createComponent(TemplatedButtonGroupComponent);
fixture.detectChanges();
const buttongroup = fixture.componentInstance.buttonGroup;
let error = '';
try {
buttongroup.selectButton(-1);
buttongroup.selectButton(3000);
buttongroup.deselectButton(-1);
buttongroup.deselectButton(3000);
} catch (ex) {
error = ex.message;
}
expect(error).toBe('');
});
it('Button Group - DisplayDensity property is applied', () => {
const fixture = TestBed.createComponent(InitButtonGroupComponent);
fixture.detectChanges();
const buttongroup = fixture.componentInstance.buttonGroup;
expect(buttongroup.displayDensity).toBe('comfortable');
buttongroup.displayDensity = 'compact';
fixture.detectChanges();
expect(buttongroup.displayDensity).toBe('compact', 'DisplayDensity not set!');
expect(buttongroup.buttons[1].element.nativeElement.classList.contains('igx-button--compact')).toBe(true, 'Missing density class!');
});
it('Button Group - DisplayDensity property is applied to templated buttons', () => {
const fixture = TestBed.createComponent(TemplatedButtonGroupDesplayDensityComponent);
fixture.detectChanges();
const buttongroup = fixture.componentInstance.buttonGroup;
expect(buttongroup.displayDensity).toBe('cosy');
const groupChildren = buttongroup.buttons;
// The density class should be applied only to buttons with no DisplayDensity set
expect(groupChildren[0].displayDensity).toBe('compact');
expect(groupChildren[0].element.nativeElement.classList.contains('igx-button--compact')).toBe(true, 'Missing density class!');
expect(groupChildren[1].element.nativeElement.classList.contains('igx-button--cosy')).toBe(true, 'Missing density class!');
});
it('Button Group - should support tab navigation', () => {
const fixture = TestBed.createComponent(InitButtonGroupWithValuesComponent);
fixture.detectChanges();
const buttongroup = fixture.componentInstance.buttonGroup;
const groupChildren = buttongroup.buttons;
for (let i = 0; i < groupChildren.length; i++) {
const button = groupChildren[i];
expect(button.nativeElement.tagName).toBe('BUTTON');
if (i < groupChildren.length - 1) {
expect(button.nativeElement.disabled).toBe(false);
} else {
expect(button.nativeElement.disabled).toBe(true);
}
}
});
});
@Component({
template: `<igx-buttongroup [values]="buttons"></igx-buttongroup>`,
standalone: true,
imports: [ IgxButtonGroupComponent ]
})
class InitButtonGroupComponent implements OnInit {
@ViewChild(IgxButtonGroupComponent, { static: true }) public buttonGroup: IgxButtonGroupComponent;
public buttons: Button[];
constructor() {}
public ngOnInit(): void {
this.buttons = [
new Button({
disabled: false,
label: 'Euro',
selected: false
}),
new Button({
label: 'British Pound',
selected: true
}),
new Button({
label: 'US Dollar',
selected: false
})
];
}
}
@Component({
template: `
<igx-buttongroup multiSelection="true" itemContentCssClass="customContentStyle"
[values]="cities" [alignment]="alignment">
</igx-buttongroup>
`,
standalone: true,
imports: [ IgxButtonGroupComponent ]
})
class InitButtonGroupWithValuesComponent implements OnInit {
@ViewChild(IgxButtonGroupComponent, { static: true }) public buttonGroup: IgxButtonGroupComponent;
public cities: Button[];
public alignment = ButtonGroupAlignment.vertical;
constructor() {}
public ngOnInit(): void {
this.cities = [
new Button({
disabled: false,
label: 'Sofia',
selected: false,
togglable: false
}),
new Button({
disabled: false,
label: 'London',
selected: false
}),
new Button({
disabled: false,
label: 'New York',
selected: false
}),
new Button({
disabled: true,
label: 'Tokyo',
selected: false
})
];
}
}
@Component({
template: `
<igx-buttongroup [multiSelection]="multiselection" [alignment]="alignment">
<button igxButton>Sofia</button>
<button igxButton>London</button>
<button igxButton>New York</button>
<button igxButton [disabled]="'true'">Tokio</button>
</igx-buttongroup>
`,
standalone: true,
imports: [ IgxButtonGroupComponent, IgxButtonDirective ]
})
class TemplatedButtonGroupComponent {
@ViewChild(IgxButtonGroupComponent, { static: true }) public buttonGroup: IgxButtonGroupComponent;
public alignment = ButtonGroupAlignment.vertical;
public multiselection = true;
}
@Component({
template: `
<igx-buttongroup [multiSelection]="multiselection" displayDensity="cosy">
<button igxButton displayDensity="compact">Sofia</button>
<button igxButton>London</button>
</igx-buttongroup>
`,
standalone: true,
imports: [ IgxButtonGroupComponent, IgxButtonDirective ]
})
class TemplatedButtonGroupDesplayDensityComponent {
@ViewChild(IgxButtonGroupComponent, { static: true }) public buttonGroup: IgxButtonGroupComponent;
}