Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[#85] Rename demo app (and any references) to Design System Toolbox #399

Merged
merged 30 commits into from
Jan 21, 2025
Merged
Changes from 1 commit
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
d72bd22
refactor: name of the demo app root folder (#85)
pylapp Jan 20, 2025
1eb829e
refactor: xcodeproj, xcworkspace, Podfile, targets, pods (#85)
pylapp Jan 20, 2025
924773f
refactor: update .gitignore (#85)
pylapp Jan 20, 2025
dc1b760
chore: clean up (#85)
pylapp Jan 20, 2025
e74d9f5
refactor: update .swiftlint.yml (#85)
pylapp Jan 20, 2025
a607419
refactor: update CHANGELOG (#85)
pylapp Jan 20, 2025
cfb806e
refactor: update GEMFILE (#85)
pylapp Jan 20, 2025
aa04e81
refactor: update NOTICE (#85)
pylapp Jan 20, 2025
3d16059
refactor: update THIRD_PARTY (#85)
pylapp Jan 20, 2025
577938b
refactor: update CODEOWNERS (#85)
pylapp Jan 20, 2025
c2ef0e1
refactor: update DEVELOP (#85)
pylapp Jan 20, 2025
fa48a2a
refactor: update GitHub Actions workflows (#85)
pylapp Jan 20, 2025
38416f2
refactor: update docs (#85)
pylapp Jan 20, 2025
4447a94
refactor: update Fastfile (#85)
pylapp Jan 20, 2025
14ee149
refactor: update pbxproj (#85)
pylapp Jan 20, 2025
2ca6438
refactor: update tests plan for lib (#85)
pylapp Jan 20, 2025
49924a2
refactor: update tests plan for snapshots (#85)
pylapp Jan 20, 2025
993c01e
refactor: update Periphery (#85)
pylapp Jan 20, 2025
8fe3a6f
refactor: objects and files of demo app (#85)
pylapp Jan 20, 2025
c80c606
refactor: SwiftLint build phase (#85)
pylapp Jan 20, 2025
3cc08b5
refactor: Fastfile test lane (#85)
pylapp Jan 20, 2025
7d50ea9
chore: clean up (#85)
pylapp Jan 20, 2025
88caf48
refactor: Fastfile variables (#85)
pylapp Jan 20, 2025
e33d6a0
chore: clean up (#85)
pylapp Jan 20, 2025
af579d6
chore: clean up (#85)
pylapp Jan 20, 2025
d0e8908
chore: clean up
pylapp Jan 21, 2025
c8c3930
refactor: clean pbxproj
pylapp Jan 21, 2025
6df2edb
chore: relink files
pylapp Jan 21, 2025
da703c6
refactor: relink tests
pylapp Jan 21, 2025
162086c
refactor: relink tests
pylapp Jan 21, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Prev Previous commit
Next Next commit
refactor: relink tests
Signed-off-by: Pierre-Yves Lapersonne <[email protected]>
pylapp committed Jan 21, 2025

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
commit da703c6068de4ae5a74c9ff7dcc97e8f1c93fd0f
217 changes: 120 additions & 97 deletions DesignToolbox/DesignToolbox.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
//
// Software Name: OUDS iOS
// SPDX-FileCopyrightText: Copyright (c) Orange SA
// SPDX-License-Identifier: MIT
//
// This software is distributed under the MIT license,
// the text of which is available at https://opensource.org/license/MIT/
// or see the "LICENSE" file for more details.
//
// Authors: See CONTRIBUTORS.txt
// Software description: A SwiftUI components library with code examples for Orange Unified Design System
//

import OUDS
import OUDSComponents
import OUDSThemesInverse
import OUDSThemesOrange
import OUDSTokensSemantic
import SnapshotTesting
import SwiftUI
import XCTest

// swiftlint:disable required_deinit

// MARK: - Test Cases

/// Tests the UI rendering of the `OUDSButton` for each parameter
final class OUDSComponentButtonUITests: XCTestCase {

/// Tests all buttons configuration in the `OrangeTheme` with the `light` color schemes.
@MainActor func testAllButtonsOrangeThemeLight() {
let theme = OrangeTheme()
let interfaceStyle = UIUserInterfaceStyle.light
testAllButtons(theme: theme, interfaceStyle: interfaceStyle)
testAllButtonsOnColoredSurface(theme: theme, interfaceStyle: interfaceStyle)
}

/// Tests all buttons configuration in the `OrangeTheme` with the `dark` color schemes.
@MainActor func testAllButtonsOrangeThemeDark() {
let theme = OrangeTheme()
let interfaceStyle = UIUserInterfaceStyle.dark
testAllButtons(theme: theme, interfaceStyle: interfaceStyle)
testAllButtonsOnColoredSurface(theme: theme, interfaceStyle: interfaceStyle)
}

/// Tests all buttons configuration in the `InverseTheme` with the `light` color schemes.
@MainActor func testAllButtonsInverseThemeLight() {
let theme = InverseTheme()
let interfaceStyle = UIUserInterfaceStyle.light
testAllButtons(theme: theme, interfaceStyle: interfaceStyle)
testAllButtonsOnColoredSurface(theme: theme, interfaceStyle: interfaceStyle)
}

/// Tests all buttons configuration in the `InverseTheme` with the `dark` color schemes.
@MainActor func testAllButtonsInverseThemeDark() {
let theme = InverseTheme()
let interfaceStyle = UIUserInterfaceStyle.dark
testAllButtons(theme: theme, interfaceStyle: interfaceStyle)
testAllButtonsOnColoredSurface(theme: theme, interfaceStyle: interfaceStyle)
}

// MARK: - Helpers

/// This function tests all buttons configuration for the given theme and color schemes on a standard surface.
///
/// **/!\ It does not test the hover and pressed states.**
/// **The loading style is not tested yet as we face troubles with animations and snapshots.**
///
/// It iterates through all button `hierarchy`, for all `style` with *textOnly, textAndIcon and iconOnly* layouts
/// in enable and disabled states.
///
/// - Parameters:
/// - theme: The theme (`OUDSTheme`).
/// - interfaceStyle: The user interface style (light or dark).
@MainActor private func testAllButtons(theme: OUDSTheme, interfaceStyle: UIUserInterfaceStyle) {
for hierarchy in OUDSButton.Hierarchy.allCases {
for layout in ButtonTest.Layout.allCases {
testButton(theme: theme, interfaceStyle: interfaceStyle, layout: layout, hierarchy: hierarchy, disabled: false, onColoredSurface: false)
testButton(theme: theme, interfaceStyle: interfaceStyle, layout: layout, hierarchy: hierarchy, disabled: true, onColoredSurface: false)
}
}
}

/// This function tests all buttons configuration for the given themen and color schemes on aa colored surface (the `colorSurfaceBrandPrimary` token)
///
/// **/!\ It does not text the hover and pressed states.**
/// **The loading style is not tested yet as we face troubles with animations and snapshots.**
///
/// It iterates through all button `hierarchy`, for all `style` with* textOnly, textAndIcon and iconOnly layouts*
/// in enable and disbled state.
///
/// - Parameters:
/// - theme: The theme (`OUDSTheme) from which to retrieve color tokens.
/// - interfaceStyle: The user interface style (light or dark) for which to test the colors.
@MainActor private func testAllButtonsOnColoredSurface(theme: OUDSTheme, interfaceStyle: UIUserInterfaceStyle) {
// Skip test for negative hierarchy because it is not allowed on colored surface
for hierarchy in OUDSButton.Hierarchy.allCases where hierarchy != .negative {
for layout in ButtonTest.Layout.allCases {
testButton(theme: theme, interfaceStyle: interfaceStyle, layout: layout, hierarchy: hierarchy, disabled: false, onColoredSurface: true)
testButton(theme: theme, interfaceStyle: interfaceStyle, layout: layout, hierarchy: hierarchy, disabled: true, onColoredSurface: true)
}
}
}

/// This function tests button according to all parameters of the configutation available on a `OUDButton`
/// for the given theme and color schemes and on a colored surface or not.
///
/// It captures a snapshot for each tests. The snapshots are saved with names based on each parameters
/// test_<themeName>_<colorScheme>.<coloreSurface>_<layout>_<hierarchy>_<style>_<disabled>
///
/// **/!\ It does not text the hover and pressed states.**
/// **The loading style is not tested yet as we face troubles with animations and snapshots.**
///
/// - Parameters:
/// - theme: The theme (OUDSTheme)
/// - interfaceStyle: The user interface style (light or dark)
/// - layout: the layout of the button
/// - hierarchy; the hierarchy of the button
/// - disabled: the disbled flag
/// - onColoredSurface: a flag to know if button is on a colored surface or not
@MainActor private func testButton(theme: OUDSTheme,
interfaceStyle: UIUserInterfaceStyle,
layout: ButtonTest.Layout,
hierarchy: OUDSButton.Hierarchy,
disabled: Bool,
onColoredSurface: Bool = false) {
// Generate the illustration for the specified configuration
let illustration = OUDSThemeableView(theme: theme) {
ButtonTest(layout: layout, hierarchy: hierarchy, style: .default, onColoredSurface: onColoredSurface)
.background(theme.colors.colorBgPrimary.color(for: interfaceStyle == .light ? .light : .dark))
.disabled(disabled)
}

// Encapsulate the generated illustration in a UIHostingController for snapshot testing
let hostingVC = UIHostingController(rootView: illustration)

// Create a unique snapshot name based on the current configuration :
// test_<themeName>_<colorScheme>.<coloreSurfacePatern><layout>_<hierarchy>_<style><disapledPatern> where:
// - `coloredSurfacePatern` is empty if not on colored surface
// - `disabledPatern` is empty if not disabled
let testName = "test_\(theme.name)Theme_\(interfaceStyle == .light ? "Light" : "Dark")"
let coloredSurfacePatern = onColoredSurface ? "ColoredSurface_" : ""
let disabledPatern = disabled ? "_Disabled" : ""
let name = "\(coloredSurfacePatern)\(layout.rawValue.camelCase)_\(hierarchy.description)_\(OUDSButton.Style.default.description)\(disabledPatern)"

// Capture the snapshot of the illustration with the correct user interface style and save it with the snapshot name
assertSnapshot(of: hostingVC, as: .image(traits: UITraitCollection(userInterfaceStyle: interfaceStyle)), named: name, testName: testName)
}
}

// MARK: - Button Test

private struct ButtonTest: View {

enum `Layout`: String, CaseIterable {
case text
case textAndIcon
case icon
}

@Environment(\.theme) private var theme
@Environment(\.colorScheme) private var colorScheme

let layout: `Layout`
let hierarchy: OUDSButton.Hierarchy
let style: OUDSButton.Style
let onColoredSurface: Bool

var body: some View {
if onColoredSurface {
OUDSColoredSurface(color: theme.colors.colorSurfaceBrandPrimary.color(for: colorScheme), content: button)
} else {
button()
}
}

func button() -> some View {
switch layout {
case .text:
OUDSButton(text: "Button", hierarchy: hierarchy, style: style) {}
case .textAndIcon:
OUDSButton(icon: Image(decorative: "ic_heart"), text: "Button", hierarchy: hierarchy, style: style) {}
case .icon:
OUDSButton(icon: Image(decorative: "ic_heart"), hierarchy: hierarchy, style: style) {}
}
}
}

// swiftlint:enable required_deinit
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Loading