Coverage Summary for Class: GuildBuilder (com.galarzaa.tibiakt.core.section.community.guild.builder)

Class Method, % Branch, % Line, % Instruction, %
GuildBuilder 77.8% (14/18) 82.9% (29/35) 74.7% (162/217)
GuildBuilder$GuildMemberBuilder 100% (9/9) 50% (4/8) 100% (16/16) 97.1% (132/136)
Total 85.2% (23/27) 50% (4/8) 88.2% (45/51) 83.3% (294/353)


 /*
  * Copyright © 2025 Allan Galarza
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
  *     http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 
 package com.galarzaa.tibiakt.core.section.community.guild.builder
 
 import com.galarzaa.tibiakt.core.builder.BuilderDsl
 import com.galarzaa.tibiakt.core.builder.TibiaKtBuilder
 import com.galarzaa.tibiakt.core.builder.requireField
 import com.galarzaa.tibiakt.core.domain.character.Vocation
 import com.galarzaa.tibiakt.core.section.community.guild.model.Guild
 import com.galarzaa.tibiakt.core.section.community.guild.model.GuildHall
 import com.galarzaa.tibiakt.core.section.community.guild.model.GuildInvite
 import com.galarzaa.tibiakt.core.section.community.guild.model.GuildMember
 import kotlinx.datetime.LocalDate
 
 @BuilderDsl
 internal inline fun guildBuilder(block: GuildBuilder.() -> Unit): GuildBuilder = GuildBuilder().apply(block)
 
 @BuilderDsl
 internal inline fun guild(block: GuildBuilder.() -> Unit): Guild = guildBuilder(block).build()
 
 /** Builder for [Guild] instances. */
 @BuilderDsl
 internal class GuildBuilder : TibiaKtBuilder<Guild> {
     var world: String? = null
     var name: String? = null
     var logoUrl: String? = null
     var description: String? = null
     var foundedOn: LocalDate? = null
     var isActive: Boolean = false
     var areApplicationsOpen: Boolean = false
     var homepage: String? = null
     var guildHall: GuildHall? = null
     var disbandsOn: LocalDate? = null
     var disbandingReason: String? = null
     val members: MutableList<GuildMember> = mutableListOf()
     val invited: MutableList<GuildInvite> = mutableListOf()
 
     fun guildHall(name: String, paidUntil: LocalDate): GuildBuilder =
         apply { guildHall = GuildHall(name, paidUntil) }
 
     fun guildHall(guildHall: GuildHall): GuildBuilder = apply { this.guildHall = guildHall }
 
     fun addMember(
         rank: String,
         name: String,
         title: String?,
         vocation: Vocation,
         level: Int,
         joiningDate: LocalDate,
         isOnline: Boolean,
     ): GuildBuilder = apply {
         members.add(GuildMember(name, rank, title, level, vocation, joiningDate, isOnline))
     }
 
     @BuilderDsl
     fun addMember(block: GuildMemberBuilder.() -> Unit): Boolean =
         members.add(GuildMemberBuilder().apply(block).build())
 
     fun addInvite(name: String, inviteDate: LocalDate): GuildBuilder =
         apply { invited.add(GuildInvite(name, inviteDate)) }
 
     override fun build(): Guild = Guild(
         world = requireField(world, "world"),
         name = requireField(name, "name"),
         logoUrl = requireField(logoUrl, "logoUrl"),
         description = description,
         foundedOn = requireField(foundedOn, "foundedOn"),
         isActive = isActive,
         areApplicationsOpen = areApplicationsOpen,
         homepageUrl = homepage,
         guildHall = guildHall,
         members = members,
         invited = invited,
         disbandsOn = disbandsOn,
         disbandingReason = disbandingReason,
     )
 
     class GuildMemberBuilder : TibiaKtBuilder<GuildMember> {
         lateinit var rank: String
         lateinit var name: String
         var title: String? = null
         lateinit var vocation: Vocation
         var level: Int = 0
         lateinit var joinedOn: LocalDate
         var isOnline: Boolean = false
 
         override fun build(): GuildMember = GuildMember(
             rank = requireField(::rank.isInitialized, "rank") { rank },
             name = requireField(::name.isInitialized, "name") { name },
             title = title,
             vocation = requireField(::vocation.isInitialized, "vocation") { vocation },
             level = level,
             joinedOn = requireField(::joinedOn.isInitialized, "joinedOn") { joinedOn },
             isOnline = isOnline,
         )
     }
 }