14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License.
54514f5e3Sopenharmony_ci * You may obtain a copy of the License at
64514f5e3Sopenharmony_ci *
74514f5e3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
84514f5e3Sopenharmony_ci *
94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and
134514f5e3Sopenharmony_ci * limitations under the License.
144514f5e3Sopenharmony_ci */
154514f5e3Sopenharmony_ci
164514f5e3Sopenharmony_ci#include "ecmascript/js_symbol.h"
174514f5e3Sopenharmony_ci#include "ecmascript/tests/test_helper.h"
184514f5e3Sopenharmony_ci
194514f5e3Sopenharmony_ciusing namespace panda;
204514f5e3Sopenharmony_ciusing namespace panda::ecmascript;
214514f5e3Sopenharmony_ci
224514f5e3Sopenharmony_cinamespace panda::test {
234514f5e3Sopenharmony_ciclass JSSymbolTest : public BaseTestWithScope<false> {
244514f5e3Sopenharmony_ci};
254514f5e3Sopenharmony_ci
264514f5e3Sopenharmony_ciHWTEST_F_L0(JSSymbolTest, SymbolCreate)
274514f5e3Sopenharmony_ci{
284514f5e3Sopenharmony_ci    ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
294514f5e3Sopenharmony_ci    JSHandle<JSSymbol> normallSymbol = factory->NewJSSymbol();
304514f5e3Sopenharmony_ci    EXPECT_TRUE(*normallSymbol != nullptr);
314514f5e3Sopenharmony_ci    EXPECT_TRUE(normallSymbol->GetDescription().IsUndefined());
324514f5e3Sopenharmony_ci
334514f5e3Sopenharmony_ci    JSHandle<JSSymbol> privateSymbol = factory->NewPrivateSymbol();
344514f5e3Sopenharmony_ci    EXPECT_TRUE(*privateSymbol != nullptr);
354514f5e3Sopenharmony_ci    EXPECT_TRUE(privateSymbol->IsPrivate());
364514f5e3Sopenharmony_ci    EXPECT_TRUE(privateSymbol->GetDescription().IsUndefined());
374514f5e3Sopenharmony_ci
384514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> symbolName(factory->NewFromASCII("hello world"));
394514f5e3Sopenharmony_ci    JSHandle<JSSymbol> privateNameSymbol = factory->NewPrivateNameSymbol(symbolName);
404514f5e3Sopenharmony_ci    EXPECT_TRUE(*privateNameSymbol != nullptr);
414514f5e3Sopenharmony_ci    EXPECT_TRUE(privateNameSymbol->IsPrivateNameSymbol());
424514f5e3Sopenharmony_ci    EXPECT_FALSE(privateNameSymbol->GetDescription().IsUndefined());
434514f5e3Sopenharmony_ci
444514f5e3Sopenharmony_ci    JSHandle<JSSymbol> wellKnowSymbol = factory->NewWellKnownSymbol(symbolName);
454514f5e3Sopenharmony_ci    EXPECT_TRUE(*wellKnowSymbol != nullptr);
464514f5e3Sopenharmony_ci    EXPECT_TRUE(wellKnowSymbol->IsWellKnownSymbol());
474514f5e3Sopenharmony_ci    EXPECT_FALSE(wellKnowSymbol->GetDescription().IsUndefined());
484514f5e3Sopenharmony_ci}
494514f5e3Sopenharmony_ci
504514f5e3Sopenharmony_ciHWTEST_F_L0(JSSymbolTest, SymbolEqual)
514514f5e3Sopenharmony_ci{
524514f5e3Sopenharmony_ci    ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
534514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> helloWord(factory->NewFromASCII("hello world"));
544514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> hiWord(factory->NewFromASCII("hi world"));
554514f5e3Sopenharmony_ci
564514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> helloWord1SymbolVal(factory->NewPrivateNameSymbol(helloWord));
574514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> helloWord2SymbolVal(factory->NewPrivateNameSymbol(helloWord));
584514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> hiWordSymbolVal(factory->NewPrivateNameSymbol(hiWord));
594514f5e3Sopenharmony_ci    JSSymbol *helloWord1Symbol = JSSymbol::Cast(helloWord1SymbolVal->GetTaggedObject());
604514f5e3Sopenharmony_ci    JSSymbol *helloWord2Symbol = JSSymbol::Cast(helloWord2SymbolVal->GetTaggedObject());
614514f5e3Sopenharmony_ci    JSSymbol *hiWordSymbol = JSSymbol::Cast(hiWordSymbolVal->GetTaggedObject());
624514f5e3Sopenharmony_ci    EXPECT_TRUE(JSSymbol::Equal(*helloWord1Symbol, *helloWord2Symbol));
634514f5e3Sopenharmony_ci    helloWord2Symbol->SetFlags(1);
644514f5e3Sopenharmony_ci    EXPECT_FALSE(JSSymbol::Equal(*helloWord1Symbol, *helloWord2Symbol));
654514f5e3Sopenharmony_ci    EXPECT_FALSE(JSSymbol::Equal(*helloWord1Symbol, *hiWordSymbol));
664514f5e3Sopenharmony_ci}
674514f5e3Sopenharmony_ci}  // namespace panda::test
68